注意
hasManyThrough
自体、あまり使わないため、
現在のスキルから新しい記事を作成しました。
最新版はこちら
Laravel Eloquent リレーションは怖くない
目的
特定のユーザーの所持するゲーム一覧をリレーションテーブルを経由してマスタを取得したい。
ユーザーテーブル
user_master_id | name |
---|---|
1 | 田中太郎 |
2 | 岡たけし |
3 | Niclas Karlsson |
ゲームマスタテーブル
game_master_id | name |
---|---|
1 | ファイナルファイト |
2 | 聖剣伝説2 |
3 | 桃太郎伝説 |
ユーザーごとの所持ゲームテーブル
id | user_id | game_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 3 |
3 | 2 | 1 |
4 | 2 | 2 |
5 | 3 | 2 |
ユーザーをベースにしたモデル
// ユーザーモデル
class User extends Model
{
public function Games() {
return $this->hasManyThrough(①, ②, ③, ④, ⑤, ⑥); // ← 毎回忘れる
}
}
答え
番号 | user_id |
---|---|
① | リレーションを経由したあとに取得したいモデル (Model\Game) |
② | リレーション用のモデル (Model\UserGame) |
③ | ②のモデルを呼び出し元のモデル (Model\User) と結びつけるために使うキー (user_id) |
④ | ①のマスタID (game_master_id) |
⑤ | 不明 |
⑥ | ②のモデルを①のモデルと結びつけるために使うキー (game_id) |
つまり
return $this->hasManyThrough(
Model\Game::class,
Model\UserGame::class,
'user_id',
'game_master_id',
null,
'game_id'
);