Есть ли сокращение для нас, чтобы вставить новую запись, если она не существует, и обновить запись, если она существует? ниже используется код 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
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