LaravelのEloquentモデルクラスに定義すべき多対多の関連性、とくにフォローしている人、されている人の関連性についてまとめました。
イメージとしてはUserクラスにメソッドとして、followings(自分がフォローしているユーザー)、followers(自分をフォローしているユーザー)メソッドの使い方についてです。
ER図
フォローユーザー(followings)の表現
Userテーブルにおいて、フォローしているユーザーを多数持ちます。
followsテーブルがフォロー関連性をまとめているので、フォローしている自分のID がfollower_id
のレコード 全て取得します。
そのレコードのそれぞれのfollowee_id
が自分がそれぞれフォローしているユーザーにあたります。
Eloquentモデルにおいてはこのフォローしている関連性(followings)を、
followsテーブルを用いると、どのクラス(第一引数)
のどのテーブル(第二引数)
でどのカラム(第三引数)
がどのカラム(第四引数)
をどうする(メソッド名)
にあたるイメージです。
ここではUserクラス
でfollowsテーブル
を参照して、フォローしている
関連性を表現したいので、
第三引数のフォローしているカラムを表すfollower_id
に続いて、フォローされているカラムのfollowee_id
が入るイメージです。
もっと簡潔にいえば、メソッド名で何をしたい(followings)
ので、第三引数、第四引数がfollower_id
、がfollowee_id
をフォローしている(followings)
といった具合です。
class User
{
public function followings(): BelongsToMany
{
return $this->belongsToMany('App\User', 'follows', 'follower_id', 'followee_id')->withTimestamps();
}
}
フォローワー(followers)の表現
同様にフォロワー(自分をフォローしているユーザー)も簡潔に表現すると、メソッド名で何をしたい(followers)
で、第三引数、第四引数がfollowee_id
、がfollower_id
にフォローされている(followers)
といったイメージでさっきのfollowings
と逆のながれでEloquentでメソッドが定義できます。
class User
{
public function followers(): BelongsToMany
{
return $this->belongsToMany('App\User', 'follows', 'followee_id', 'follower_id')->withTimestamps();
}
}
完成系
class User
{
public function followings(): BelongsToMany
{
return $this->belongsToMany('App\User', 'follows', 'follower_id', 'followee_id')->withTimestamps();
}
public function followers(): BelongsToMany
{
return $this->belongsToMany('App\User', 'follows', 'followee_id', 'follower_id')->withTimestamps();
}
}