¿Cuál es la abreviatura para insertar un nuevo registro o actualizar si existe?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
shopId
no es tu clave principal, ¿verdad?Respuestas:
Aquí hay un ejemplo completo de lo que estaba hablando "lu cip":
A continuación se muestra el enlace actualizado de los documentos que se encuentra en la última versión de Laravel
Documentos aquí: enlace actualizado
fuente
Actualizado: 27 de agosto de 2014 - [
updateOrCreate
Incorporado en el núcleo ...]En caso de que la gente todavía se encuentre con esto ... Descubrí algunas semanas después de escribir esto, que esto es en realidad parte del núcleo de Eloquent de Laravel ...
Excavando en los métodos equivalentes de Eloquent. Puedes ver aquí:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
en: 570 y: 553
Respuesta anterior a continuación
Me pregunto si hay alguna funcionalidad L4 integrada para hacer esto de alguna manera, como por ejemplo:
Creé este método hace unas semanas ...
Espero que eso ayude. Me encantaría ver una alternativa a esto si alguien tiene uno para compartir. @erikthedev_
fuente
ModelName::firstOrNew(['param' => 'condition'])->fill(Input::get())->save();
Deberías hacerlo.Actualización 2020
Como en Laravel> = 5.3 , si alguien todavía tiene curiosidad por cómo hacerlo de manera fácil. Su posible mediante el uso de:
updateOrCreate()
.Por ejemplo, para la pregunta formulada, puede usar algo como:
El código anterior verificará la tabla representada por ShopMeta, que probablemente
shop_metas
no se definirá lo contrario en el modelo mismo.e intentará encontrar la entrada con
columna
shopId = $theID
y
columna
metadateKey = 2001
y si encuentra, actualizará la columna
shopOwner
de la fila encontrada aNew One
.Si encuentra más de una fila coincidente, actualizará la primera fila, lo que significa cuál tiene la primaria más baja
id
.Si no se encuentra, insertará una nueva fila con:
shopId = $theID
,metadateKey = 2001
yshopOwner = New One
Aviso Verifique su modelo
$fillable
y solicite que tenga todos los nombres de columna definidos allí que desea insertar o actualizar y que las columnas restantes tengan el valor predeterminado o suid
columna se incremente automáticamente.De lo contrario, arrojará un error al ejecutar el ejemplo anterior:
Como habría algún campo que necesitará valor al insertar una nueva fila y no será posible ya que no está definido
$fillable
o no tiene un valor predeterminado.Para obtener más información, consulte la documentación de Laravel en: https://laravel.com/docs/5.3/eloquent
Un ejemplo a partir de ahí es:
que prácticamente borra todo.
Actualización del generador de consultas
Alguien ha preguntado si es posible usar Query Builder en Laravel. Aquí hay una referencia para el generador de consultas de los documentos de Laravel.
Query Builder funciona exactamente igual que Eloquent, por lo que cualquier cosa que sea verdadera para Eloquent también lo es para Query Builder. Entonces, para este caso específico, simplemente use la misma función con su generador de consultas de la siguiente manera:
Por supuesto, no olvides agregar la fachada DB:
O
Espero que ayude
fuente
Guardar función:
ya haz lo que quieras ...
Código Laravel:
fuente
firstOrNew
creará un registro si no existe y actualizará una fila si ya existe. También puedes usarupdateOrCreate
aquí el ejemplo completoSi hay un vuelo desde Oakland a San Diego, establezca el precio en $ 99. si no existe, cree una nueva fila
Documento de referencia aquí: ( https://laravel.com/docs/5.5/eloquent )
fuente
Si necesita la misma funcionalidad usando
DB
, en Laravel>= 5.5
puede usar:o la versión abreviada cuando
$attributes
y$values
son iguales:fuente
Luego haga sus cambios y guarde. Tenga en cuenta que firstOrNew no realiza la inserción si no se encuentra, si lo necesita, entonces es firstOrCreate.
fuente
Una opción más si su identificación no es aumento automático y sabe cuál insertar / actualizar:
fuente
Al igual que el método firstOrCreate, updateOrCreate persiste en el modelo, por lo que no es necesario llamar a save ()
Y para tu problema
fuente
En realidad, firstOrCreate no se actualizaría en caso de que el registro ya exista en la base de datos. Mejoré un poco la solución de Erik ya que en realidad necesitaba actualizar una tabla que tiene valores únicos no solo para la columna "id"
Entonces lo usarías así:
fuente
como @JuanchoRamone publicado anteriormente (gracias @Juancho) es muy útil para mí, pero si sus datos son una matriz, debería modificar un poco así:
fuente
https://github.com/yadakhov/insert-on-duplicate-key
fuente
comprobar si existe un usuario o no. Si no, inserte
fuente