데이터베이스 시스템에서 다대다 관계를 표현하기 위해서는 총 세 개의 테이블이 필요하다.

articles, articles_tag, tags (articles는 일대다 항목에서 생성하였기 때문에 생략하였다.)

마이그레이션 뼈대만들기

php artisan make:migration create_tags_table --create=tags
php artisan make:migration create_article_tag_table --create=article_tag

마이그레이션 열 생성(테이블 컬럼)

databases/migrations/TIMESTAMP_create_tags_table.php

    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('sulg')->index();
            $table->timestamps();
        });
    }

databases/migrations/TIMESTAMP_create_article_tag_table.php

    public function up()
    {
        Schema::create('article_tag', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('article_id')->unsigned();
            $table->integer('tag_id')->unsigned();

            $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
            $table->timestamps();
        });
    }

마이그레이션 실행

php artisan migrate

모델관계 연결

php artisan make:model Tag

app\Tag.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    protected $fillable = ['name', 'sulg'];

    public function articles()
    {
    	return $this->belongsToMany(Article::class)
    }
}

Article 모델과 관계를 맺기 위해서 belongsToMany(모델::class)메서드를 이용했다. ("나는 여러개의 article의 소속됩니다.)

 

app\Article.php

    public function tags(){
    	return $this->belongsToMany(Tag::class);
    }

팅커콘솔에서 데이터 삽입

App\Tag::create([
'name' => 'Foo',
'slug' => 'foo',
]);
App\Tag::create([
'name' => 'Bar',
'slug' => 'bar',
]);
App\User::find(2)->articles()->create([
'title' => 'Second article',
'content' => 'Second content',
)];

tags, articles 테이블에 각2개씩 데이터를 삽입한다.


다대다 관계 테스트

$article = App\Article::find(1);
$article->tags()->sync([1,2]);
$article->tags->pluck('name','id');

$article = App\Article::find(2);
$article->tags()->sync([1]);
$article->tags->pluck('name','id');

App\Tag::find(1)->articles;

 

'라라벨 > ORM' 카테고리의 다른 글

목록과 관계모델 게시물에 대한 댓글 수 ORM작성하기  (0) 2020.03.26
엘로퀀트 ORM예제  (0) 2019.05.25
쿼리빌더 명령모음  (0) 2019.04.14

+ Recent posts