Ответ
В 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:.... Это предотвращает передачу произвольных значений, которые могут сломать логику или привести к неожиданным результатам.