Найти или создать с красноречивым

Найти или создать с красноречивым

01.12.2013 09:26:49 Просмотров 22 Источник

Я недавно начал работать с Laravel и Eloquent, и задавался вопросом об отсутствии возможности найти или создать вариант для моделей. Вы всегда можете написать, например:

$user = User::find($id);
if (!$user) {
    $user = new User;
}

Однако, нет ли лучшего способа найти или создать? Это кажется тривиальным в Примере, но для более сложных ситуаций было бы действительно полезно либо получить существующую запись и обновить ее, либо создать новую.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/20309033/find-or-create-with-eloquent#comment30305196_20309033
Я не красноречивый Эксперт, Однако, даже если такого метода нет, скорее всего, вы можете определить его в абстрактном классе или черте, которую все ваши модели расширяют / используют.

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

Является ответом!
The Alpha

01.12.2013 10:40:30

Ниже приведен оригинальный принятый ответ для: Laravel-4

В Laravel уже есть метод findOrFailLaravelна 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

Существование пользователя будет проверяться только по электронной почте, но при создании новой записи будет сохранена как электронная почта, так и имя.

Документы API

https://stackoverflow.com/questions/20309033/find-or-create-with-eloquent/20309494#comment59212715_20309494
findOrCreateне существует в Laravel 5x, так как вы не можете создать что-то, используя только идентификатор. Я думаю, что вы имеете в виду findOrNew.
https://stackoverflow.com/questions/20309033/find-or-create-with-eloquent/20309494#comment59214886_20309494
Право @SteveEdson но это firstOrCreate :-)
https://stackoverflow.com/questions/20309033/find-or-create-with-eloquent/20309494#comment89613595_20309494
Возможно, стоит упомянуть, что если объект был создан firstOrCreateто он еще не был сохранен в базе данных. Вам нужно будет вызвать save вручную, чтобы сохранить его.
https://stackoverflow.com/questions/20309033/find-or-create-with-eloquent/20309494#comment89639242_20309494
@Адам, на самом деле firstOrNewделает это (то, что вы упомянули здесь), но firstOrCreateсохраняет его. Проверьте здесь.
https://stackoverflow.com/questions/20309033/find-or-create-with-eloquent/20309494#comment91250291_20309494
@TheAlpha, могу я попросить вас взглянуть на вопрос, связанный с запросом Laravel join, здесь : stackoverflow.com/questions/52149031/... ?
Oliver Adria

27.03.2014 01:33:51

Кроме того, в этом случае вы также можете использовать функцию Laravel и искать id в качестве атрибута, т. е.

$user = User::firstOrCreate(['id' => $id]);
Peter Gluck

27.10.2014 09:19:45

Модели Laravel 4 имеют встроенный findOrNew

https://stackoverflow.com/questions/20309033/find-or-create-with-eloquent/26582096#comment58933122_26582096
Примечание найти или создать экземпляр объекта, но вам все равно нужно использовать функцию save()
Mahmoud Zalt

15.10.2015 08:45:47

Вы можете использовать firstOrCreate (он работает с Laravel 4.2)

$bucketUser = BucketUser::firstOrCreate([
    'bucket_id' => '1',
    'user_id'   => '2',
]);

возвращает найденный экземпляр или новый экземпляр.

Salar

24.02.2016 12:04:19

В Laravel 5:
Существует два метода, которые можно использовать для создания моделей путем массового присвоения атрибутов: firstOrCreateи firstOrNew.
firstOrCreatefirstOrCreate попытается найти запись базы данных, используя заданные пары столбец / значение. Если модель не может быть найдена в базе данных, будет вставлена запись с заданными атрибутами.
firstOrCreatefirstOrNew, например 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']);
Majbah Habib

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();
Закрыть X