Если вы работали с 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 таким удобным для работы.