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

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

124 回閲覧されました

みなさんこんにちは、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を使うとコードの可読性が落ちないと思います。