🙄

Laravel 11: afterQuery() フックでクエリ後の処理をスマートに!

2025/03/05に公開

概要

Laravel 11.4で、afterQuery() フックが導入されました。
これは、クエリを実行した後(get()等の実行メソッド)の処理を予め定義しておけるフックです。

$query->afterQuery(function ($models) {
    // クエリで取得したモデルに対して変更を加える処理 ...
});

使用例

例えば、「ユーザーがお気に入り登録しているかどうか(is_favorite)」を判定するスコープを考えます。

変更前のコード

public function scopeWithIsFavoriteOf($query, ?User $user = null) : void
{
    if ($user === null) {
        return $query;
    }

    $query->addSelect([
        // 'is_favorite' => 何らかのクエリ ...
    ]);
}

$products = Product::withIsFavoriteOf(auth()->user())->get();

if (auth()->user() === null) {
    $products->each->setAttribute('is_favorite', false);
}

このコードでは、認証ユーザーがいない場合、クエリ後に $products->each->setAttribute('is_favorite', false); を手動で実行しています。

afterQuery() フックを使ったコード

public function scopeWithIsFavoriteOf($query, ?User $user = null) : void
{
    if ($user === null) {
        $query->afterQuery(fn ($products) => $products->each->setAttribute('is_favorite', false));

        return;
    }

    $query->addSelect([
        // 'is_favorite' => 何らかのクエリ ...
    ]);
}

Product::withIsFavoriteOf(auth()->user())->get();

引用記事

https://laravel-news.com/laravel-11-4-0

Laravelダイジェスト

Discussion