#belongsToManyメソッドの引数
belongsToManyメソッドを使うパターンは、多対多の場合に使われます。
多対多にはテーブル構造として3テーブルが必要です。
リレーション元、中間テーブル、リレーション先の3テーブルです。
中間テーブルのカラム名には【リレーション元・先のテーブル名の単数形_id】という規則性があります。
この規則性に当てはまる場合は第三、第四引数は省略可という決まりがあります。
SNSをのフォロー機能のリレーションを例に解説していきます。
※下記のUser.phpではfollowersメソッドのみ定義しております。フォロー機能の場合はもう1つメソッドを定義する必要があります。今回はbelongsToManyの引数の仕様について解説しております。
###データベース
・usersテーブル
カラム:id/name/password/created_at/updated_at
・followsテーブル
カラム:id/follower_id/followee_id\created_at/updated_at
##第三、第四引数が省略不可のパターン
先ずUserモデルにリレーションを記入。
public function followers(): BelongsToMany
{
return $this->belongsToMany('App\User', 'follows', 'followee_id', 'follower_id')->withTimestamps();
belongsToManyメソッドの第一引数には関係するモデルのモデル名を渡します。
第二引数には中間テーブルのテーブル名を渡します。
ちなみに、第二引数を省略すると、中間テーブル名は2つのモデル名の単数形をアルファベット順に結合した名前であるという前提で処理されます。つまり、user_followという中間テーブルが存在するという前提で処理がされます。
followsテーブルには、created_at、updated_atカラムが存在するので、withTimestampsメソッドを付けるようにします。
●リレーション元のusersテーブルのidと、followee_idが紐づいている
●リレーション先のusersテーブルとfollower_idが紐づいている
このような関係性の場合は第三、第四引数は省略せずに中間テーブルのカラム名の記述をします。
※中間テーブルカラム名【リレーション元・先のテーブル名の単数形_id】という規則性に当てはまらない
##第三、第四引数が省略可のパターン
例えば、『いいね機能』のリレーションについて
###データベース
・postsテーブル
カラム:id/body/user_id/created_at/updated_at
・likesテーブル
カラム:id/user_id/post_id/created_at/updated_at
・usersテーブル
カラム:id/name/password/created_at/updated_at
public function followers(): BelongsToMany
{
return $this->belongsToMany('App\User', 'likes')->withTimestamps();
●リレーション元のpostsテーブルのidは、中間テーブルのpost_idに紐づいている。
●リレーション先のusersテーブルのidは、中間テーブルのuser_idと紐づいている。
この場合は、第三・第四引数の省略が可能です。
※中間テーブルカラム名【リレーション元・先のテーブル名の単数形_id】という規則性に当てはまる