Laravelのリレーション hasOne()、hasMany()、belongsTo()の仕組みについて

Laravelのリレーションの説明を読むと、1対1の時はhasOne()で1対nの場合はhasMany()でとか、ER図書いて説明とか、それは分かったから実際それらの関数は自動で何をしてくれてるのよ??
ってよく思ったのでメモ

■hasOne(), hasMany()

 ユーザ(users)から電話(phones)を求めるような場合

 usersテーブル   phonesテーブル
  id ———-┐    id
       └——–> user_id

 ポイントは3つ
  $this->hasOne(Phone::class)
  (user)    (phone)
  (_id)

  テーブルのid = テーブルの+カラムのレコードを取得
  user      phone   user_id

 hasMany()でも考え方は同じ
 ・返り値がModel型かCollection型かの違いだけ
  つまり、1レコードか複数レコードが返ってくるかの違い
 ・phonesに一致するレコードが複数存在してhasOne()を使っても1レコード返ってくるだけでエラーにはならない

■belongsTo()

 電話(phones)から持ち主(users)を求めるような場合

 phonesテーブル    usersテーブル
  id     ┌———— id
  user_id ——-┘

 同じようにポイントは3つ
 $this->belongsTo(User::class)
 (phone)    (user)
 (_id)

 テーブルの+カラム = テーブルのidカラムのレコードを取得
 phone   user_id   user

仕組みはこれだけのこと!!

ちなみにカラム名が命名規則に従っていなくても
hasOne(),hasMany(),belongsTo()のパラメータで指定出来る。

belongsToMany()は、n対nになるので、間に1つテーブルを挟むが
上記の3つが理解出来れば大丈夫だと思う

2件のコメント

  1. これ!私も帰ってきたデータの違いや仕組みがイマイチ曖昧だったので、これからすっごく役立つとおもいます。
    今、管理画面の見た目にしか着手できてないけど、これができればDB関係もきちんと理解をふかめねば。。。
    ありがたい記事第何弾??4弾くらいかな。笑

返信を残す

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