3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Laravel】リレーションの書き方

Last updated at Posted at 2020-04-21

はじめに

この記事は初学者の僕が私的メモとして書いているものです。
リレーションの書き方で詰まってる人の役にたてばと思います!

モデルにリレーションを書く

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が外部キーを判断してくれるのでどう動いているのか理解するのに苦労しました。

ざっくりとなぐり書きになってしまいましたが、少しでもリレーションの理解が深まればと思います。
内容についても修正点等、ご指摘頂けると幸いです!

参考サイト

Laravel 5.5 Eloquent:リレーション

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?