はじめに
whereHasの処理が遅いと言われていますが、詳しくは下記の記事を見て下さい。
whereHasが必ず悪いというわけではなく、状況次第ではwhereHasを使っても問題ありませんが、無難にwhereInへ書き換える方法を超ざっくり解説します。
https://qiita.com/mpyw/items/0761a5e44836c9bebcd5
こちらでは結局どう書けばいいのか分からない初心者に超ざっくり説明するだけの記事です。
目次
whereHasの処理
そもそもwhereHasとはリレーション先のテーブルからwhere等で絞り込んだ状態でデータを取得したい時に使います。
例えば、id=1のユーザーの投稿(posts)から公開中だけのものを絞り込みたい時は以下のように使います。
// ユーザーid=1の人を絞り込む
$user = User::where('id', 1);
// usersテーブルのリレーション先であるpostsテーブルを指定し、クロージャの中でデータを絞り込む
$published_post = $user->whereHas('posts',function($query){
$query->where('is_published', true);
})->get();
whereInで同様の処理を書く
上で紹介したwhereHasをwhereInに書き換えてみます。
これでwhereHasを使用した時と同じデータが取得できます。
// ユーザーid=1の人を絞り込む
$user = User::where('id', 1);
// whereInの中にリレーション先のモデルインスタンスを記述し、絞りこんでデータを取得する。
$published_post = $user->whereIn('id', Post::select('user_id')
->where('is_published', true))
->get();