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()を使うことで
記事 → タグ へのリレーションが完成します。