plantillas - Laravel 5.1 Crear o actualizar en duplicado
que es el motor de plantillas blade (5)
Agregue el siguiente método insertUpdate a su modelo
<?php
namespace App;
use Illuminate/Auth/Authenticatable;
use Illuminate/Database/Eloquent/Model;
use Illuminate/Auth/Passwords/CanResetPassword;
use Illuminate/Foundation/Auth/Access/Authorizable;
use Illuminate/Contracts/Auth/Authenticatable as AuthenticatableContract;
use Illuminate/Contracts/Auth/Access/Authorizable as AuthorizableContract;
use Illuminate/Contracts/Auth/CanResetPassword as CanResetPasswordContract;
class User extends Model implements AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = ''users'';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [''name'', ''email'', ''password''];
/**
* The attributes excluded from the model''s JSON form.
*
* @var array
*/
protected $hidden = [''password'', ''remember_token''];
public static function insertUpdate(array $attributes = [])
{
$model = new static($attributes);
$model->fill($attributes);
if ($model->usesTimestamps()) {
$model->updateTimestamps();
}
$attributes = $model->getAttributes();
$query = $model->newBaseQueryBuilder();
$processor = $query->getProcessor();
$grammar = $query->getGrammar();
$table = $grammar->wrapTable($model->getTable());
$keyName = $model->getKeyName();
$columns = $grammar->columnize(array_keys($attributes));
$insertValues = $grammar->parameterize($attributes);
$updateValues = [];
if ($model->primaryKey !== null) {
$updateValues[] = "{$grammar->wrap($keyName)} = LAST_INSERT_ID({$keyName})";
}
foreach ($attributes as $k => $v) {
$updateValues[] = sprintf("%s = ''%s''", $grammar->wrap($k), $v);
}
$updateValues = join('','', $updateValues);
$sql = "insert into {$table} ({$columns}) values ({$insertValues}) on duplicate key update {$updateValues}";
$id = $processor->processInsertGetId($query, $sql, array_values($attributes));
$model->setAttribute($keyName, $id);
return $model;
}
}
Puedes usar:
App/User::insertUpdate([
''name'' => ''Marco Pedraza'',
''email'' => ''[email protected]''
]);
La siguiente consulta será ejecutada:
insert into `users` (`name`, `email`, `updated_at`, `created_at`) values (?, ?, ?, ?) on duplicate key update `id` = LAST_INSERT_ID(id),`name` = ''Marco Pedraza'',`email` = ''[email protected]'',`updated_at` = ''2016-11-02 01:30:05'',`created_at` = ''2016-11-02 01:30:05''
El método agrega / elimina automáticamente las marcas de tiempo de Eloquent si ha habilitado o deshabilitado.
En Laravel 5.1, para la inserción en MySQL, quiero ver si el registro ya existe y actualizarlo por duplicado o crear nuevo si no existe.
Ya he buscado SO donde estaban las respuestas para versiones anteriores de laravel. En uno de los temas anteriores, dijo que el año pasado se agregó un nuevo método updateOrCreate()
. Pero cuando intento eso, me sale el error:
Integrity constraint violation: 1062 Duplicate entry ''1'' for key ''app_id''
Esta es la consulta que utilizo:
AppInfo::updateOrCreate(array(
''app_id'' => $postData[''appId''],
''contact_email'' => $postData[''contactEmail'']
));
Donde app_id
es la clave externa única en esa tabla y quiero actualizar el registro si existe o crear uno nuevo. He intentado buscar en los documentos 5.1 y no pude encontrar la información que necesito. ¿Puede alguien guiarme aquí por favor ...
Creé un paquete para trabajar con MySQL insert en clave duplicada.
Puede ser útil para otros:
https://packagist.org/packages/yadakhov/insert-on-duplicate-key
Ejemplo:
/**
* Class User.
*/
class User extends Model
{
use Yadakhov/InsertOnDuplicateKey;
...
}
// associative array must match column names
$users = [
[''id'' => 1, ''email'' => ''[email protected]'', ''name'' => ''User One''],
[''id'' => 2, ''email'' => ''[email protected]'', ''name'' => ''User Two''],
[''id'' => 3, ''email'' => ''[email protected]'', ''name'' => ''User Three''],
];
User::insertOnDuplicateKey($users);
Estoy respondiendo a esta pregunta porque no puedo encontrar ninguna respuesta relacionada con ON DUPLICATE KEY UPDATE, aunque estoy usando Laravel 5.4 . Si observa el método updateOrCreate en el código central de Laravel, verá que, después de todo, Laravel está utilizando 2 consultas diferentes: una para actualizar y otra para crear. Debido a esto, a veces puede obtener datos duplicados en la base de datos. Entonces, en algunos casos, puede ser útil escribir este tipo de consulta en bruto:
DB :: statement ("INSERT INTO
col_1
(col_1
,col_2
) VALORES (?,?) EN LA ACTUALIZACIÓN DE LA LLAVE DUPLICADAcol_1
=col_1
+ 1", ([val_1, val_2]));
Espero que pueda ser de utilidad para alguien.
Para usar la función laravel updateOrCreate , necesita un ID de incremento automático en su tabla.
lo que están haciendo es
select id from your_table where your_attributes
después de eso obtendré la identificación de incremento automático
entonces
update your_table set your_values where field_id
Según la Definición del Método del Modelo Elocuente "updateOrCreate ()"
función updateOrCreate (array $ atributos, array $ valores = []) {}
se necesitan dos argumentos ...
- uno es los atributos con los que desea verificar la base de datos si el registro está presente
- En segundo lugar están los nuevos valores de atributo que desea crear o actualizar.
AppInfo::updateOrCreate([''app_id'' => $postData[''appId'']],
[''contact_email'' => $postData[''contactEmail'']]);