Eloquentリレーションのまとめ

  • laravel

投稿者と記事を例に考えてみる

  • 投稿者は記事を1つだけ書く(1対1)
  • 投稿者は記事を幾つも書く(1対多)

投稿者から記事にアクセス

主テーブル(投稿者)のモデルに記事メソッドを追加

  • 1対1の時 hasOneメソッド
  • 1対多の時 hasManyメソッド

記事から投稿者にアクセス

従テーブル(記事)のモデルに投稿者メソッドを追加

  • belongsToメソッド

多対多 記事とタグで考えてみる

(例)記事にはいくつもタグがつけられて、そのタグがついている記事もいくつもある

  • 中間テーブル(テーブル名はアルファベット順に2つのテーブル名を_でつないで作る)を作る
  • 中間テーブルのモデルは不要
  • 記事とタグはどちらもからの呼び出しでもbelongsToManyメソッドを使う

注意1

例えばusersテーブルの主キーはid、articles テーブルの外部キーは関連するテーブル名の単数形_id(user_id)であるという前提のもと、Laravel側で処理をしている(ネーミングルール)
laravel6リレーション

注意2

N+1問題(1回のレコードを取得実行でN+1回データベースにアクセスすることのなる)
対策

  • loadメソッドに引数としてリレーション名を渡す
  • withメソッドに引数としてリレーション名を渡す

Home