데이터베이스 시스템에서 다대다 관계를 표현하기 위해서는 총 세 개의 테이블이 필요하다.
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 |