Как бы ни была прекрасна документация Laravel, но в фреймворке еще много недокументированных функций и скрытых жемчужин. Одной из них является Eloquent-метод firstOr()
.
Впервые я узнал о нём из этого твита. Выглядело интригующим и я запрыгнул в эту кроличью нору, занявшись своим любимым видом спорта: ныряние в исходники Laravel.
Что делает firstOr()?
Этот метод, кажется, был добавлен в Laravel 5.4, и его можно найти в vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php
. Выглядит знакомо, так как похоже на родственные методы — first()
и firstOrFail()
. В отличие от firstOrFail()
, наш метод выполняет обратный вызов, если результат отсутствует, что может быть быть очень мощной фишкой, в зависимости от ваших потребностей.
Первый параметр — это массив столбцов, которые вы хотите извлечь из запроса (если есть результат). Второй параметр — упомянутый обратный вызов.
Давайте посмотрим на это в работе. Вот несколько примеров, иллюстрирующих, как вы можете это использовать.
Fail с Ответом
$r = App\User::where('id', 1)->firstOr(['name', 'email'], function () { return response()->json([ 'message' => 'Такого пользователя не существует.', ], 404); });
Illuminate\Http\JsonResponse {#3474 +headers: Symfony\Component\HttpFoundation\ResponseHeaderBag {#3480}, +original: [ "message" => "Такого пользователя не существует.", ], +exception: null, }
Fail с Исключением
$r = App\User::where('id', 1)->firstOr(['name', 'email'], function () { throw new \Exception('Такого пользователя не существует.'); });
Exception {#3388 #message: "Такого пользователя не существует.", #file: "...\vendor\psy\psysh\src\ExecutionLoopClosure.php(55) : eval()'d code", #line: 2, }
Fail с Логом
$r = App\User::where('id', 1)->firstOr(['name', 'email'], function () { logger('Такого пользователя не существует.'); });
Тогда в laravel.log вы увидите:
[2019-06-02 21:14:03] local.DEBUG: Такого пользователя не существует.
Success
Успешный запрос возвращает объект коллекции Eloquent.
App\User {#3441 name: "Mr. Leon Muller", email: "maiya57@example.net", }
Если вам нужен массив, вы можете, разумеется, добавить toArray():
$r = App\User::where('id', 1)->firstOr(['name', 'email'], function () { throw new \Exception('Такого пользователя не существует.'); })->toArray();
Но есть альтернатива:
$r = App\User::where('id', 1)->firstOr(function() { throw new \Exception('Такого пользователя не существует.'); })->only('name', 'email');
// результат [ "name" => "Mr. Leon Muller", "email" => "maiya57@example.net", ]
Автор: Constantin
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.