Елегантна обробка результатів запитів за допомогою методу afterQuery у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 08 квітня, 2025
Вдоскональте свої запити Eloquent за допомогою нового хуку afterQuery() у Laravel, який спрощує маніпуляції з колекціями після отримання даних з бази, роблячи код чистішим і зрозумілішим. Чи готові ви дізнатися, як цей потужний метод може полегшити вашу розробку? Читайте далі!

Покращте обробку запитів 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 користувачем повністю інкапсульована у скоупі. Ваш контролер просто викликає скоуп, не потребуючи знати або реалізовувати умовну логіку, що призводить до більш стійкої і легкої в обслуговуванні архітектури додатку