56
58

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 3 years have passed since last update.

Laravelのリレーション hasManyThrough の使い方を毎回間違うのでメモ

Last updated at Posted at 2018-02-22

注意

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'
);
56
58
2

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
56
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?