🙄
Laravel 11: afterQuery() フックでクエリ後の処理をスマートに!
概要
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();
引用記事
Discussion