Laravelで多対多のリレーションをして保存、表示する方法【belongsToMany】
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
この記事では、Laravel で多対多のリレーションをモデルに定義すること。多対多の中間テーブルにデータを保存する方法、多対多のデータを表示する方法について書いていきます。
リレーションとは?
データベースのテーブル間で関係性のあるデータのことを指します。
今回の例で言えば、user_id を保存しておけば、users テーブルから user データを参照することが できるようなことです。
Laravel では、少しの定義でこれを簡単に実装することができます。
検証環境
Laravel 6
テーブル設計
posts テーブルと、tags テーブルがあって、posts に紐づく tags が複数あるケースの話になります。
簡単にいうと、「ハッシュタグを複数つけられるようにしたい」ってことです。
そういう時には、多対多のリレーションを使う必要があります。
多対多には中間テーブルが必要
中間テーブルというのは、今回の画像でいうところの、
post_tag テーブルに当たります。
中間テーブル名は、単数系_単数系じゃないとダメ
まず、中間テーブルとして紐づけたいテーブルとテーブルの単数系をアンダーバーでつなぐ必要があります。
posts と tags テーブルの中間テーブルなので、post_tag となります。
中間テーブル名は、a-z 順で早い方が左側にこないとダメ
a-z 順という書き方をしてしまいましたが、abcd 順という意味です。
今回は、posts の p が、tags の t より abcd 順で先に来るので、post_tag というテーブル名になります。
users と tags の中間テーブルなら、t の方が u より先に来るので、tag_user になります。
モデルに定義する
中間テーブル用のモデルは不要です。
その代わり、Posts テーブ ルのモデルと、Tags テーブルのモデルの2つに記述する必要があります。
モデル Post.php
public function tags()
{
return $this->belongsToMany('App\Tag');
}
モデル Tag.php
public function posts()
{
return $this->belongsToMany('App\Post');
}
App\Post のところはモデルがあるところを定義してあげてください(App\Models\Post の人もいると思います。)