Что такое сокращение для вставки новой записи или обновления, если она существует?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
shopId
это не твой первичный ключ, верно?Ответы:
Вот полный пример того, о чем говорил lu cip:
Ниже приведена обновленная ссылка на документы, которые есть в последней версии Laravel.
Документы здесь: Обновленная ссылка
источник
Обновлено: 27 августа 2014 г. - [
updateOrCreate
Встроено в ядро ...]Просто на тот случай, если люди все еще сталкиваются с этим ... Я узнал через несколько недель после написания этого, что это на самом деле часть ядра Eloquent в Laravel ...
Копаться в эквивалентных методах Eloquent. Вы можете увидеть здесь:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
на: 570 и: 553
Старый ответ ниже
Мне интересно, есть ли какая-либо встроенная функциональность L4 для этого, например:
Я создал этот метод несколько недель назад ...
Надеюсь, это поможет. Я хотел бы видеть альтернативу этому, если у кого-то есть, чем поделиться. @erikthedev_
источник
ModelName::firstOrNew(['param' => 'condition'])->fill(Input::get())->save();
должен сделать это.2020 Обновление
Как и в Laravel> = 5.3 , если кому-то все еще интересно, как это сделать простым способом. Его можно с помощью:
updateOrCreate()
.Например, для заданного вопроса вы можете использовать что-то вроде:
Приведенный выше код проверит таблицу, представленную ShopMeta, которая, скорее всего,
shop_metas
будет, если не определено иначе в самой моделии он попытается найти запись с
колонка
shopId = $theID
и
колонка
metadateKey = 2001
и если он найдет то обновит столбец
shopOwner
найденной строки доNew One
.Если он находит более одной совпадающей строки, он обновит самую первую строку, что означает, что у нее самый низкий основной
id
.Если он вообще не найден, он вставит новую строку с:
shopId = $theID
,metadateKey = 2001
иshopOwner = New One
Замечание Проверьте свою модель
$fillable
и убедитесь, что у вас есть каждое имя столбца, определенное там, которое вы хотите вставить или обновить, а остальные столбцы имеют либо значение по умолчанию, либо значениеid
столбца автоматически увеличивается.В противном случае он выдаст ошибку при выполнении приведенного выше примера:
Так как будет какое-то поле, которое будет нуждаться в значении при вставке новой строки, и это будет невозможно, так как оно не определено
$fillable
или не имеет значения по умолчанию.Для получения дополнительной информации см. Документацию Laravel по адресу: https://laravel.com/docs/5.3/eloquent.
Один пример оттуда:
который в значительной степени очищает все.
Обновление Query Builder
Кто-то спросил, возможно ли использовать Query Builder в Laravel. Вот ссылка на Query Builder из документов Laravel.
Query Builder работает точно так же, как Eloquent, поэтому все, что верно для Eloquent, также верно и для Query Builder. Так что для этого конкретного случая, просто используйте ту же функцию с вашим построителем запросов, например, так:
Конечно, не забудьте добавить фасад БД:
ИЛИ
Я надеюсь, что это помогает
источник
Функция сохранения:
уже делай что хочешь ...
Код Laravel:
источник
firstOrNew
создаст запись, если она не существует, и обновит строку, если она уже существует. Вы также можете использоватьupdateOrCreate
здесь полный примерЕсли есть рейс из Окленда в Сан-Диего, установите цену в $ 99. если не существует, создайте новую строку
Справочный документ здесь: ( https://laravel.com/docs/5.5/eloquent )
источник
Если вам нужна та же функциональность с помощью
DB
, в Laravel>= 5.5
вы можете использовать:или сокращенная версия, когда
$attributes
и$values
то же самое:источник
Затем внесите изменения и сохраните. Обратите внимание, что firstOrNew не выполняет вставку, если она не найдена, если вам это нужно, тогда ее firstOrCreate.
источник
Еще один вариант, если ваш идентификатор не является автоинкрементом, и вы знаете, какой из них вставить / обновить:
источник
Как и метод firstOrCreate, updateOrCreate сохраняет модель, поэтому нет необходимости вызывать save ()
И для вашего вопроса
источник
На самом деле firstOrCreate не будет обновляться в случае, если регистр уже существует в БД. Я немного улучшил решение Эрика, так как мне действительно нужно было обновить таблицу с уникальными значениями не только для столбца "id".
Тогда вы бы использовали это так:
источник
как @JuanchoRamone, опубликованный выше (спасибо @Juancho), это очень полезно для меня, но если ваши данные являются массивом, вы должны изменить немного так:
источник
https://github.com/yadakhov/insert-on-duplicate-key
источник
проверьте, существует ли пользователь или нет. Если не вставить
источник