投稿者と記事を例に考えてみる
- 投稿者は記事を1つだけ書く(1対1)
- 投稿者は記事を幾つも書く(1対多)
投稿者から記事にアクセス
主テーブル(投稿者)のモデルに記事メソッドを追加
- 1対1の時 hasOneメソッド
- 1対多の時 hasManyメソッド
記事から投稿者にアクセス
従テーブル(記事)のモデルに投稿者メソッドを追加
多対多 記事とタグで考えてみる
(例)記事にはいくつもタグがつけられて、そのタグがついている記事もいくつもある
- 中間テーブル(テーブル名はアルファベット順に2つのテーブル名を_でつないで作る)を作る
- 中間テーブルのモデルは不要
- 記事とタグはどちらもからの呼び出しでもbelongsToManyメソッドを使う
注意1
例えばusersテーブルの主キーはid、articles テーブルの外部キーは関連するテーブル名の単数形_id(user_id)であるという前提のもと、Laravel側で処理をしている(ネーミングルール)
laravel6リレーション
注意2
N+1問題(1回のレコードを取得実行でN+1回データベースにアクセスすることのなる)
対策
- loadメソッドに引数としてリレーション名を渡す
- withメソッドに引数としてリレーション名を渡す
Home