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:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
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 a New 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 su id
columna se incremente automáticamente.
De lo contrario, arrojará un error al ejecutar el ejemplo anterior:
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))'
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:
// 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]
);
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:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Por supuesto, no olvides agregar la fachada DB:
use Illuminate\Support\Facades\DB;
O
use DB;
Espero que ayude
shopId
no es tu clave principal, ¿verdad?