🤠

[Laravel] withとwhereHasを組み合わせて使う

2023/01/01に公開

LaravelでwithとwhereHasを同時に使いたいと思い調べてみる、と公式ドキュメントに載ってました。備忘がてら公式ドキュメントの内容をもとに、使い方を書いていきます。
早速公式ドキュメントを見たい人はこちらです。

https://laravel.com/docs/9.x/eloquent-relationships#constraining-eager-loads-with-relationship-existence

場面

以下のようなリレーションが組まれた2つのテーブルがあるとします。
"postsテーブルのfeatureカラムがTRUEのデータを持つuserを取得したい" かつ "userを取得するときは紐づくpostも取得したい" という状況だとします(黄色塗りのデータを取得したい)。
whereHasだけだと前者しかできない。。

以下、公式ドキュメントの例を引用してます。model部分です。

class User extends Model
{
    // UsersとPostsの関係
    public function posts()
    {
        return $this->hasMany('App\Eloquent\Post');
    }
}
class Post extends Model
{
    public function user()
    {
        return $this->belongsTo('App\Eloquent\User');
    }
}

取得方法

結論、withWhereHasメソッドを使えばOKです。
こんな短く書けるなんて便利!
以下、公式ドキュメントの例を引用してます。controller部分です。

use App\Models\User;
 
$users = User::withWhereHas('posts', function ($query) {
    $query->where('featured', true);
})->get();

参考

https://laravel.com/docs/9.x/eloquent-relationships#constraining-eager-loads-with-relationship-existence

https://stackoverflow.com/questions/29591931/merge-with-and-wherehas-in-laravel-5

Discussion