with wheredate updateorcreate meaning php laravel laravel-4 eloquent

php - wheredate - Actualización sin tocar las marcas de tiempo(Laravel)



wheredate laravel (8)

¿Es posible actualizar a un usuario sin tocar las marcas de tiempo?

No quiero desactivar las marcas de tiempo completamente ...

grtz


Deshabilitarlo temporalmente:

$user = User::find(1); $user->timestamps = false; $user->age = 72; $user->save();

Opcionalmente, puede volver a habilitarlos después de guardar.

Esta es una característica exclusiva de Laravel 4 y 5 y no se aplica a Laravel 3.


En Laravel 5.2 , puede establecer el campo público $timestamps en false como este:

$user->timestamps = false; $user->name = ''new name''; $user->save();

O puede pasar las opciones como un parámetro de la función save() :

$user->name = ''new name''; $user->save([''timestamps'' => false]);

Para una comprensión más profunda de cómo funciona, puede echar un vistazo a la clase /Illuminate/Database/Eloquent/Model , en el método performUpdate(Builder $query, array $options = []) :

protected function performUpdate(Builder $query, array $options = []) // [...] // First we need to create a fresh query instance and touch the creation and // update timestamp on the model which are maintained by us for developer // convenience. Then we will just continue saving the model instances. if ($this->timestamps && Arr::get($options, ''timestamps'', true)) { $this->updateTimestamps(); } // [...]

Los campos de marcas de tiempo se actualizan solo si la propiedad pública timestamps es igual a true o Arr::get($options, ''timestamps'', true) devuelve true (que lo hace de forma predeterminada si el array $options no contiene las timestamps la clave).

Tan pronto como uno de estos dos devuelve false , los campos de timestamps no se actualizan.


Las muestras anteriores funcionan bien, pero solo para un solo objeto (solo una fila por vez).

Esta es una forma fácil de desactivar temporalmente las marcas de tiempo si desea actualizar toda la colección.

class Order extends Model { .... public function scopeWithoutTimestamps() { $this->timestamps = false; return $this; } }

Ahora puedes simplemente llamar a algo como esto:

Order::withoutTimestamps()->leftJoin(''customer_products'',''customer_products.order_id'',''='',''orders.order_id'')->update(array(''orders.customer_product_id'' => /DB::raw(''customer_products.id'')));


Me encontré con la necesidad de hacer una actualización masiva que implica una unión, por lo que updated_at causaba conflictos de columna duplicados. Lo arreglé con este código sin necesidad de un alcance:

$query->where(function (/Illuminate/Database/Eloquent/Builder $query) { $query->getModel()->timestamps = false; })


Para agregar a la respuesta de Antonio Carlos Ribeiro

Si su código requiere la desactivación de marcas de tiempo más del 50% del tiempo, tal vez debería desactivar la actualización automática y acceder manualmente.

En elocuente cuando extiendes el modelo elocuente, puedes inhabilitar la marca de tiempo al poner

ACTUALIZAR

public $timestamps = false;

dentro de tu modelo.


Para los usuarios de Laravel 5.x que están tratando de realizar una llamada Model::update() , para que funcione puede usar

Model::where(''example'', $data) ->update([ ''firstValue'' => $newValue, ''updatedAt'' => /DB::raw(''updatedAt'') ]);

Como la función Model :: update ya no toma un segundo argumento. ref: laravel 5.0 api

Probado y trabajando en la versión 5.2.


Si necesita actualizar consultas de modelo único :

$product->timestamps = false; $product->save();

o

$product->save([''timestamps'' => false]);

Si necesita actualizar varias consultas de modelo, use

DB::table(''products'')->...->update(...)

en lugar de

Product::...->update(...)


También puedes usar esta sintaxis:

Model::where(''Y'', ''X'') ->update([''Y'' => ''Z''], [''timestamps'' => false]);