同一テーブル内でのリレーションとなる場合
例)twitter的なアプリでユーザ間のフォロー関係を表現したいとき
三人のユーザ(フィル、カイ、ラミー)のフォロー関係が下のようになっている
usersテーブル
id | name |
---|---|
1 | フィル |
2 | カイ |
3 | ラミー |
関連を持たせるのはユーザ同士、つまり同一テーブル内のデータ同士。
もちろん、ユーザーは複数人のユーザをフォローするため多対多のリレーションになる。
→中間テーブルとしてfollowersテーブルにユーザ間の関係をまとめる。
followersテーブル
following_id(フォローする側) | followed_id(フォローされる側) |
---|---|
1 | 2 |
1 | 3 |
2 | 1 |
3 | 2 |
following_idをフォローする側のID、followed_idをフォローされる側のIDとすると、このように関係性が表せる。 |
リレーションメソッド
User.php
public function followers()
{
return $this->belongsToMany(self::class, "followers", "followed_id", "following_id");
}
public function follows()
{
return $this->belongsToMany(self::class, "followers", "following_id", "followed_id");
}
第一引数で参照するテーブルを指定するが、今回は同一テーブルなので自身のテーブルになる。第二引数には中間テーブルとなるfolloersテーブルを指定。
followers()はフォローされているユーザIDから、フォローしているユーザIDにアクセスする。
follows()はその逆向きのアクセス。