Покращте обробку запитів Eloquent завдяки новому хуку afterQuery() у Laravel, який пропонує зручний підхід до маніпуляцій із колекціями після отримання даних з бази, зберігаючи ваш код чистим і легким для обслуговування
$query->afterQuery(function ($models) {
// Внесіть зміни до запитаних моделей ...
});
Цей потужний метод приймає замикання, яке отримує колекцію моделей, повернених вашим запитом, що дозволяє вам виконувати трансформації, додавати обчислені властивості або здійснювати інші модифікації безпосередньо до результатів перед їх відправкою у ваш код
// До
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);
}
Традиційний підхід вище вимагає перевірки на null у двох різних місцях — спочатку в визначенні скоупу, а потім після виконання запиту. Це створює крихку залежність, де ваш контролер повинен розуміти та реалізовувати додаткову обробку на основі стану аутентифікації
// Після
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();
З afterQuery() відповідальність за обробку випадку з null користувачем повністю інкапсульована у скоупі. Ваш контролер просто викликає скоуп, не потребуючи знати або реалізовувати умовну логіку, що призводить до більш стійкої і легкої в обслуговуванні архітектури додатку