Intereting Posts

Вставьте новую запись, если она не существует, и обновите, если она существует, laravel eloquent

Есть ли сокращение для нас, чтобы вставить новую запись, если она не существует, и обновить запись, если она существует? ниже используется код i.

$shopOwner = ShopMeta::where('shopId', '=', $theID)->where('metadataKey', '=', 2001)->first(); if ($shopOwner==null){ insert new record into database } else { update the existing record } 

благодаря

Вот полный пример того, что говорил «lu cip»:

 $user = User::firstOrNew(array('name' => Input::get('name'))); $user->foo = Input::get('foo'); $user->save(); 

Документы здесь: http://laravel.com/docs/eloquent#insert-update-delete

Обновлено: 27 авг 2014 – [ updateOrCreate в ядро ​​…]

На всякий случай люди все еще сталкиваются с этим … Я узнал через несколько недель после написания этого, что это на самом деле часть ядра Laravel's Eloquent …

Выкапывание в эквивалентный метод (ы) Эвкалипта. Вы можете посмотреть здесь:

https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553

по: 570 и: 553

  /** * Create or update a record matching the attributes, and fill it with values. * * @param array $attributes * @param array $values * @return static */ public static function updateOrCreate(array $attributes, array $values = array()) { $instance = static::firstOrNew($attributes); $instance->fill($values)->save(); return $instance; } 

Старый ответ ниже


Мне интересно, есть ли какие-либо встроенные функции L4 для этого в некотором роде, например:

 $row = DB::table('table')->where('id', '=', $id)->first(); // Fancy field => data assignments here $row->save(); 

Я создал этот метод несколько недель назад …

 // Within a Model extends Eloquent public static function createOrUpdate($formatted_array) { $row = Model::find($formatted_array['id']); if ($row === null) { Model::create($formatted_array); Session::flash('footer_message', "CREATED"); } else { $row->update($formatted_array); Session::flash('footer_message', "EXISITING"); } $affected_row = Model::find($formatted_array['id']); return $affected_row; } 

Надеюсь, это поможет. Мне бы хотелось увидеть альтернативу этому, если кто-то хочет поделиться. @erikthedev_

Как и в Laravel> = 5.3 , если кому-то все еще любопытно, как это сделать легко. Его можно использовать с помощью: updateOrCreate() .

Например, для заданного вопроса вы можете использовать что-то вроде:

 $matchThese = array('shopId'=>$theID,'metadataKey'=>2001); ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']); 

Над кодом будет проверяться таблица, представленная ShopMeta, которая, скорее всего, будет shop_metas если иное не определено в самой модели

и он попытается найти запись с

column shopId = $theID

а также

column metadateKey = 2001

и если он найдет, то он обновит колонку shopOwner найденной строки до New One .

Если он найдет несколько совпадающих строк, он обновит самую первую строку, которая имеет наименьший первичный id .

Если он вообще не найден, он вставляет новую строку с:

shopId = $theID , metadateKey = 2001 и shopOwner = New One

Примечание. Проверьте свою модель на $fillable и сделайте иск, что у вас есть каждое имя столбца, которое указано там, где вы хотите вставлять или обновлять и сохранять столбцы, либо по умолчанию, либо по столбцу с индексом auto auto incremented.

В противном случае он будет вызывать ошибку при выполнении вышеприведенного примера:

 Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field '...' doesn't have a default value (SQL: insert into `...` (`...`,.., `updated_at`, `created_at`) values (...,.., xxxx-xx-xx xx:xx:xx, xxxx-xx-xx xx:xx:xx))' 

Поскольку будет какое-то поле, которое будет нуждаться в ценности при вставке новой строки, и это будет невозможно, поскольку либо не определено в $fillable либо не имеет значения по умолчанию.

Дополнительную информацию см. В Laravel Documentation по адресу: https://laravel.com/docs/5.3/eloquent

Один из примеров:

 // If there's a flight from Oakland to San Diego, set the price to $99. // If no matching model exists, create one. $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99] ); 

который в значительной степени очищает все.

Я надеюсь, что это помогает

Функция сохранения:

 $shopOwner->save() 

уже делай то, что хочешь …

Код Laravel:

  // If the model already exists in the database we can just update our record // that is already in this database using the current IDs in this "where" // clause to only update this model. Otherwise, we'll just insert them. if ($this->exists) { $saved = $this->performUpdate($query); } // If the model is brand new, we'll insert it into our database and set the // ID attribute on the model to the value of the newly inserted row's ID // which is typically an auto-increment value managed by the database. else { $saved = $this->performInsert($query); } 
 $shopOwner = ShopMeta::firstOrNew(array('shopId' => $theID,'metadataKey' => 2001)); 

Затем сделайте свои изменения и сохраните. Обратите внимание, что firstOrNew не делает вставку, если ее не найдено, если вам нужно это, то ее firstOrCreate.

Фактически firstOrCreate не будет обновляться, если регистр уже существует в БД. Я немного улучшил решение Эрика, поскольку мне действительно нужно было обновить таблицу, которая имеет уникальные значения не только для столбца «id»,

 /** * If the register exists in the table, it updates it. * Otherwise it creates it * @param array $data Data to Insert/Update * @param array $keys Keys to check for in the table * @return Object */ static function createOrUpdate($data, $keys) { $record = self::where($keys)->first(); if (is_null($record)) { return self::create($data); } else { return self::where($keys)->update($data); } } 

Тогда вы будете использовать его следующим образом:

 Model::createOrUpdate( array( 'id_a' => 1, 'foo' => 'bar' ), array( 'id_a' => 1 ) ); 

как @JuanchoRamone, опубликованный выше (спасибо @Juancho), это очень полезно для меня, но если ваши данные являются массивами, вы должны немного изменить это:

 public static function createOrUpdate($data, $keys) { $record = self::where($keys)->first(); if (is_null($record)) { return self::create($data); } else { return $record->update($data); } } 

Еще один вариант, если ваш идентификатор не автоинкремент, и вы знаете, какой из них следует вставить / обновить:

 $object = MyModel::findOrNew($id); //assign attributes to update... $object->save(); 

проверьте, существует ли пользователь или нет. Если не вставить

 $exist = DB::table('User')->where(['username'=>$username,'password'=>$password])->get(); if(count($exist) >0) { echo "User already exist";; } else { $data=array('username'=>$username,'password'=>$password); DB::table('User')->insert($data); } Laravel 5.4