Laravelで多対多のリレーションを結合する方法【記事にタグ情報を付与】

Webアプリケーションを作成していくうえで、避けては通れないデータベースの作成・データ構造の作成です。

そのなかでも少し複雑になる多対多のリレーションの作成について解説していきます。

以前、下記にてリレーションについて解説しております。
今回は、多対多のみについて、少し深くです。

今回は、記事にタグを付与する多対多のリレーションをイメージしてみます。

記事A・記事B・記事C
タグ1・タグ2・タグ3

といった具体にお互いが、1対多の関係になる状態が多対多の関係性です。

作成するテーブルは、
・記事
・タグ
・記事とタグを紐づける中間テーブル

この3つです。

記事とタグを紐づける中間テーブル とは、何か。
記事IDとタグID
の紐づけが行われるテーブルです。

記事A_ID タグ1_ID
記事A_ID タグ2_ID
記事B_ID タグ2_ID
記事C_ID タグ3_ID

みたいに、各記事とタグのIDを紐づけます。

Modelに対してリレーションを記述していきます。
記事モデルに対して、タグとのリレーションを記述します。

1対多のリレーションの考え方でいくと
記事 → 中間テーブル → タグ でテーブル2つ跨ぐのでリレーションを2度する必要があると考えられますが、Laravelのリレーションはここを1度で処理する方法があります。

public function tagRelations()
{
return $this->belongsToMany('App\Models\Tag', 'tag_maps', 'article_id', 'tag_id' );
} 

簡単に解説します。

belongsToMany メソッドを使います。
第2引数は、中間テーブルとなるテーブル名称
第3引数は、モデルID(記事)と中間テーブルを紐づける、中間テーブルのカラム
第4引数は、リレーション先ID(タグ)と中間テーブルを紐づける、中間テーブルのカラム

これで、tagRelations()を使うことで
記事 → タグ へのリレーションが完成します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です