Найти или создать с красноречивым
Я недавно начал работать с Laravel и Eloquent, и задавался вопросом об отсутствии возможности найти или создать вариант для моделей. Вы всегда можете написать, например:
$user = User::find($id);
if (!$user) {
$user = new User;
}
Однако, нет ли лучшего способа найти или создать? Это кажется тривиальным в Примере, но для более сложных ситуаций было бы действительно полезно либо получить существующую запись и обновить ее, либо создать новую.

Ответы - Найти или создать с красноречивым / Find or Create with Eloquent

01.12.2013 10:40:30
Ниже приведен оригинальный принятый ответ для: Laravel-4
В Laravel уже есть метод findOrFail
Laravel
на fail, но в вашем случае вы можете сделать это, создав метод в своей модели, например, если у вас есть ModelNotFoundException
модель, то вы просто помещаете эту функцию в модель
User
С вашего контроллера, вы можете использовать
// Put this in any model and use
// Modelname::findOrCreate($id);
public static function findOrCreate($id)
{
$obj = static::find($id);
return $obj ?: new static;
}
Если пользователь с $user = User::findOrCreate(5);
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->save();
id
существует, то он будет обновлен, в противном случае будет создан новый пользователь, но 5
будет id
(автоматически увеличивается).
Это еще один способ сделать то же самое:
last_user_id + 1
Вместо создания статического метода вы можете использовать public function scopeFindOrCreate($query, $id)
{
$obj = $query->find($id);
return $obj ?: new static;
}
в модели, поэтому метод в scope
будет Model
и вызов scopeMethodName
, так же, как и в статическом методе, например
Model::methodName()
Обновление:
$user = User::findOrCreate(5);
, ответ слишком старый, и он был дан для firstOrCreate
в Laravel 5x
году .
В Laravel 5.3 Laravel-4.0
Что означает, что вы можете использовать его так:
2013
Существование пользователя будет проверяться только по электронной почте, но при создании новой записи будет сохранена как электронная почта, так и имя.

findOrCreate
не существует в Laravel 5x, так как вы не можете создать что-то, используя только идентификатор. Я думаю, что вы имеете в виду findOrNew
.

firstOrCreate
:-)

firstOrCreate
то он еще не был сохранен в базе данных. Вам нужно будет вызвать save вручную, чтобы сохранить его.

firstOrNew
делает это (то, что вы упомянули здесь), но firstOrCreate
сохраняет его. Проверьте здесь.


27.03.2014 01:33:51
Кроме того, в этом случае вы также можете использовать функцию Laravel и искать id в качестве атрибута, т. е.
$user = User::firstOrCreate(['id' => $id]);



27.10.2014 09:19:45
Модели Laravel 4 имеют встроенный findOrNew


15.10.2015 08:45:47
Вы можете использовать firstOrCreate (он работает с Laravel 4.2)
$bucketUser = BucketUser::firstOrCreate([
'bucket_id' => '1',
'user_id' => '2',
]);
возвращает найденный экземпляр или новый экземпляр.

24.02.2016 12:04:19
В Laravel 5:
Существует два метода, которые можно использовать для создания моделей путем массового присвоения атрибутов: firstOrCreate
и firstOrNew
.
firstOrCreate
firstOrCreate попытается найти запись базы данных, используя заданные пары столбец / значение. Если модель не может быть найдена в базе данных, будет вставлена запись с заданными атрибутами.
firstOrCreate
firstOrNew, например firstOrCreate
, попытается найти запись в базе данных, соответствующую заданным атрибутам. Однако если модель не найдена, будет возвращен новый экземпляр модели . Обратите внимание, что модель, возвращенная firstOrNew
еще не сохранена в базе данных. Вам нужно будет вызвать save вручную, чтобы сохранить его:
// Retrieve the flight by the attributes, or create it if it doesn't exist...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// Retrieve the flight by the attributes, or instantiate a new instance...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);

10.08.2016 09:38:58
Найти или создать на основе идентификатора первичного ключа
$user = User::findOrNew($id); // if exist then update else insert
$user->name= $data['full_name'];
$user->save();
Первый или новый на основе непервичного ключа одного файла
// get the record where field_name=value else insert new record
$user = User::firstOrNew(['field_name'=>'value']);
$user->name= $data['full_name'];
$user->save();
Первый или новый, основанный на нескольких поданных непервичных ключах
// get the record where field_name1=value1 and field_name2=value2, else insert new record
$user = User::firstOrNew(['field_name1'=>'value1','field_name2'=>'value2']);
$user->name= $data['full_name'];
$user->save();