Laravelでリレーション先のテーブルを条件に絞り込むwhereHasの使い方

122 回閲覧されました
みなさんこんにちは、jonioです。
今回はwhereHasの使い方のメモになります。
whereHasとは
絞り込みをしたい時に対象のテーブルのカラムの値を条件にして絞り込むのではなく対象のテーブルに紐づいているテーブルのカラムの値を条件にして絞り込みをしたい時に使います。
使い方
今回はpostsテーブルに紐づいているcategoriesテーブルのnameカラムの値を条件にして絞り込みを行います。
モデルに下記の記述をします。
use App\Models\Category;
public function experiencePost() {
return Post::whereHas('category', function($query) {
$query->where('name', 'デモ');
})->get();
}
public function category() {
return $this->belongsTo(Category::class);
}
4行目のwhereHas以降が該当します。
「category」は9行目のリレーション用のメソッド名です。
「whereHas(‘category’」の「category」の部分にメソッド名を書くことでリレーションをしているテーブルのカラムの値で絞り込みを行えるようになります。
「function($query)・・・」で絞り込みを行います。
今回はcategoriesテーブルのnameカラムの値が「デモ」のレコードを探しています。
どういう場合に使うか
今回はpostsテーブルにcategory_idカラムがありますがこれを使って絞り込みをすると下記のコードになります。
public function experiencePost() {
return Post::where('category_id', 1)->get();
}
この記述だとcategory_idが1に対応するcategoriesテーブルのid=1のレコードを探しますがid=1のnameカラムの値が何か分からなくてDBで確認しないといけなくて面倒だしコードの可読性が落ちます。
こんな場合にwhereHasを使うとコードの可読性が落ちないと思います。