意外と使う機会がなくてハマったので備忘録.
状況
- articles テーブルと users テーブルが存在する.
- user は article に like することができ,user と article は多対多となっている.
- 指定したユーザ(複数)が like した article のデータを取得したい.
テーブル構成
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