Laravel When: Условная логика
В этой статье мы рассмотрим, как использовать метод when() в приложении Laravel в качестве альтернативы типичным/традиционным условным (if-else) операторам/блокам в PHP.
Типичный вариант использования if-else
$query = Post::query();
if ($request->title == 'Laravel Eloquent Queries') {
$query->where('title', $request->title);
}
$posts = $query->latest()->get();
Что такое метод when()?
Метод when() в Laravel — это простой способ применить условие к запросу или коллекции, чтобы определить, какой блок кода следует выполнить, если условие оценивается как истинное, без необходимости использования сложных условных операторов if-else или блоков.
Синтаксис метода when()
$query->when($request->has('title'), function ($query) use ($request) {
return $query->where('title', $request->title);
});
Разбор синтаксиса when()
- Условие : первый аргумент синтаксиса when(), как показано в коде выше,
$request->has('title')
является условием, которое будет оценено для возврата логического значения. Если имя присутствует в запросе, он автоматически выполняет код блока, в противном случае он пропускает код блока. - Callback : замыкание обратного вызова выполняется, если условие удовлетворяется, чтобы быть истинным или ложным, как определено разработчиком. Например,
!$request->has('title')
просто проверяет, недоступно ли имя в запросе, и продолжает работу, что отличается от проверки его существования$request->has('title')
. - Необязательный Callback : можно определить необязательный обратный вызов, который будет выполнен, если первое условие не выполнено.
💡Методunless
является обратнымwhen()
методу
Метод when() в действии
Первый аргумент (условиe) в методе when() может быть из запроса или из значения постоянной переменной, определенного в приложении.
- Выполнить Callback, если запрос имеет активный параметр и содержит истинное значение (true).
//return posts with status of true
$posts = Post::when($request->has('active'), function ($query) {
return $query->where('status', true);
})->get();
Выполнить Callback, если запрос не имеет активной переменной и является false
$posts = Post::when($request->has('active'), function ($query) {
return $query->where('status', true);
}, function ($query) {
return $query->where('status', false);
})->get();
Выполнить необязательный Callback со статусом false, если запрос не имеет активного параметра.
Как использовать множественный метод when()
Пожалуйста, убедитесь, что вы проверили значения параметров запроса.
$validator = Validator::make($request->all(), [
'title' => 'nullable|string|max:10',
'content' => 'nullable|string|max:10',
]);
// Check if validation fails
if ($validator->fails()) {
// return validation errors
}
$posts = Post::when($request->has('title'), function ($query) use ($request) {
return $query->where('title', 'LIKE', "%{$request->title}%");
})->when($request->has('content'), function ($query) use ($request) {
return $query->where('content', 'LIKE', "%{$request->content}%");
})->get();
whenEmpty()
$posts = Post::when($request->has('active'), function ($query) {
return $query->where('status', true);
})->get()
->whenEmpty(function () {
//this section will be executed if the posts result is empty
//You could return a default array
// return ;
});
whenNotEmpty()
Например: предположим, вы хотите применить преобразование первой буквы в заглавную к title
столбцу, когда коллекция записей не пуста.
Вероятно, вы хотите позаботиться об изменении в методе контроллера, не делая этого {{ ucwords($post->title) }}
в файле blade. Могут быть и более сложные причины сделать это, помимо простого применения функции верхнего регистра.
$posts = Post::when($request->has('active'), function ($query) {
return $query->where('status', true);
}, function ($query) {
return $query->where('status', false);
})
->get()
->whenNotEmpty(function ($items) {
return $items->map(function ($item) {
$item->title = ucwords($item->title);
return $item;
});
});
Применить первую букву в верхнем регистре whenNotEmpty()
💡when(), whenEmpty(), whenNotEmpty() могут быть объединены в цепочку в зависимости от функциональности выполняемого запроса.
Заключение
Применение when()
метода Laravel в запросах или коллекциях Eloquent позволяет применять условия без использования типичных условных операторов if-else. Это упрощает код, особенно при фильтрации данных, делая его более чистым и читаемым. Вы можете объединить несколько when()
методов для обработки различных условий за один раз. Однако важно внимательно просмотреть первый аргумент, содержащий пользовательские условия, так как обратный вызов будет выполнен, если условие будет оценено как истинное.