Как добавить фильтрацию по статусу в запрос контроллера (например, в Laravel)?

«Как добавить фильтрацию по статусу в запрос контроллера (например, в Laravel)?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Laravel-контроллере я обычно добавляю фильтрацию по статусу, используя валидацию входящего запроса и метод when() построителя запросов Eloquent. Это делает код безопасным и гибким.

Базовый пример с валидацией:

use AppModelsUser;
use IlluminateHttpRequest;

public function index(Request $request)
{
    // 1. Валидация входного параметра
    $validated = $request->validate([
        'status' => 'sometimes|string|in:active,inactive,pending'
    ]);

    // 2. Построение запроса с условным добавлением where
    $users = User::query()
                ->when(isset($validated['status']), function ($query) use ($validated) {
                    // Добавляем условие, только если статус передан
                    return $query->where('status', $validated['status']);
                }, function ($query) {
                    // Функция по умолчанию, если статус не передан
                    // Например, можно показывать только активных
                    return $query->where('status', 'active');
                })
                ->get();

    return view('users.index', compact('users'));
}

Почему when()? Этот метод предотвращает условные конструкции if в цепочке запросов, делая код чище. Запрос where('status', $status) не будет добавлен, если первый аргумент when()false или null.

Пример с Scope для повторяющейся логики: Если фильтрация по статусу используется в нескольких местах, я выносу её в локальный scope модели.

// В модели User
public function scopeWithStatus($query, $status = null)
{
    return $query->when($status, fn($q) => $q->where('status', $status));
}

// В контроллере теперь код становится очень лаконичным
$users = User::withStatus($validated['status'] ?? null)->get();

Безопасность: Критически важно валидировать значение статуса через правило in:.... Это предотвращает передачу произвольных значений, которые могут сломать логику или привести к неожиданным результатам.