• Время чтения ~2 мин
  • 09.06.2022

Если вы работали с Laravel хотя бы некоторое время, то, вероятно, знаете стандартные методы создания моделей Eloquent, такие как make(), create(), update и save(). Laravel также включает несколько других методов, которые также очень полезны для создания и обновления моделей, но которым, по моему мнению, не уделяется достаточно внимания. В этой статье я хотел бы рассказать о некоторых из этих дополнительных методов и объяснить, как они могут быть полезными.

firstOrNew

Метод firstOrNew действительно полезен для поиска первой модели, соответствующей некоторым условиям, или создания новой модели, если нет моделей, соответствующих этим условиям.

Вы можете преобразовать код, выглядящий следующим образом:

$user = User::where('email', request('email'))->first();
if ($user === null) {
$user = new User(['email' => request('email')]);
}
$user->name = request('name');

$user->save()

Вот так:

$user = User::firstOrNew(['email' =>  request('email')]);
$user->name = request('name');

$user->save()

Вы также можете передать массив дополнительных атрибутов вторым параметром, который будет установлен, если не будет найдено существующей модели:

$user = User::firstOrNew(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
$user->save();

firstOrCreate

Метод firstOrCreate очень похож на метод firstOrNew. Он пытается найти модель, соответствующую переданным атрибутам в первом параметре. Если модель не найдена, он автоматически создает и сохраняет новую модель после применения любых атрибутов, переданных во втором параметре:

$user = User::firstOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
// Не нужно вызывать $user->save()

firstOr

Я недавно обнаружил метод firstOr при исследовании исходного кода. Метод firstOr извлекает первую модель из запроса, и если не найдена ни одна соответствующая модель, то будет вызван переданный обратный вызов. Это может быть действительно полезно, если вам нужно выполнить дополнительные действия при создании пользователя или сделать что-то, отличное от создания нового пользователя:

$user = User::where('email', request('email'))->firstOr(function () {
    $account = Account::create([ //... ]);
return User::create([
    'account_id' => $account->id,
    'email' => request('email'),
]);
});

updateOrCreate

Метод updateOrCreate пытается найти модель, соответствующую переданным ограничениям в первом параметре. Если найдена соответствующая модель, то она будет обновлена атрибутами, переданными во втором параметре. Если соответствующая модель не найдена, будет создана новая модель с ограничениями, переданными в первом параметре, а также с атрибутами, переданными во втором параметре.

Вы можете переписать этот код:

$user = User::where('email', request('email'))->first();

if ($user !== null) {
    $user->update(['name' => request('name')]);
} else {
    $user = User::create([
         'email' => request('email'),
          'name' => request('name'),
    ]);
}
// Выполнение других действий с пользователем

На это:

$user = User::updateOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
// Выполнение других действий с пользователем

Заключение

В целом, я считаю, что эти методы могут помочь упростить ваш код в некоторых случаях и являются отличными вариантами, которые стоит иметь в своем арсенале! Дайте мне знать, если вы знаете о других полезных и малоизвестных методах. Мне нравится узнавать о таких мелких деталях, которые делают Laravel таким удобным для работы.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297