はじめに
この記事は初学者の僕が私的メモとして書いているものです。
リレーションの書き方で詰まってる人の役にたてばと思います!
モデルにリレーションを書く
UserモデルとCommentモデルのリレーションは1対多となっています。
hasManyメソッド
class User extends Model
{
// 略
public function comments() //関数名は複数形がベスト
{
return $this->hasMany('App\Comment');
}
}
Userモデルが自動的にCommentモデルの主キー、つまり各コメントのidを外部キーとして持ってくれます。
つまり、hasManyメソッドが定義されているクラス名(User)を小文字にして、語尾に_id
をつけたカラム(user_id)をhasManyメソッドの引数のモデル(Comment)の外部キーとして自動で判断してくれます。
belongsToメソッド
class Comment extends Model
{
// 略
public function user() //関数名は単数形がベスト
{
return $this->belongsTo('App\User');
}
}
hasManyを書いたらそれに対するモデルにもbelongsToメソッドを定義してあげましょう。
この場合、belongs_toメソッドの引数のUserモデルの主キーが自動的にCommentテーブルの外部キーと判断してくれます。
つまり、belongsToメソッドの引数名を小文字にして、語尾に_id
をつけたものが親モデルに対する外部キーとしてくれます。
使い方
リレーションを組んだことで親テーブルの主キーに対応する子テーブルの外部キーを使って、子テーブル内のカラムのデータを取得できるようになります。
例えば一人のユーザーに対するコメント数などを表示させたい場合以下のように書きます。
//略
$user->comments()->count('user_id')
おわりに
リレーションを記述する時、頭の中で関係性がわかってても実際のコードに落とし込むのが難しかったです。
しかも、自動的にlaravelが外部キーを判断してくれるのでどう動いているのか理解するのに苦労しました。
ざっくりとなぐり書きになってしまいましたが、少しでもリレーションの理解が深まればと思います。
内容についても修正点等、ご指摘頂けると幸いです!