Laravel で多対多の相手を whereIn で指定したい

Dec 5th, 2022 laravel php sql

意外と使う機会がなくてハマったので備忘録.

状況

テーブル構成

articles

id text
1 hoge
2 fuga
3 piyo
4 foo
5 bar
6 baz

users

id name
1 Giorno
2 Bucciarati
3 Mista
4 Abbacchio
5 Fugo

article_user

article_id user_id
1 1
1 2
2 2
3 3
4 3
4 4

解決策

例えば,article_user テーブルの user_id が 1, 2, 4 のものを取得したいとする.

予め user の id の配列を作っておき,whereIn の第 2 引数を利用すればOK.

// user の id の配列を用意しておく.
$users = [1, 2, 4];

// 第 2 引数にクエリを渡し,中間テーブルに whereIn を使う.
$articles = Article::whereIn(
  'id',
  fn ($query) =>
  $query->select('article_id')
    ->from('article_user')
    ->whereIn('user_id', $users)
);

以上だ( `・ω・)b