Обновление без касания временных меток (Laravel)

Возможно ли обновить пользователя, не касаясь временных меток?

Я не хочу полностью отключать отметки времени.

grtz

Solutions Collecting From Web of "Обновление без касания временных меток (Laravel)"

Отключите его временно:

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

Вы можете дополнительно включить их после сохранения.

Это только функция Laravel 4 и 5 и не относится к Laravel 3.

Чтобы добавить к ответу Антонио Карлоса Рибейру

Если для вашего кода требуется деактивация временных меток более 50% времени – возможно, вам следует отключить автоматическое обновление и вручную получить к нему доступ.

Вкратце, когда вы расширяете красноречивую модель, вы можете отключить метку времени, поставив

ОБНОВИТЬ

public $timestamps = false;

внутри вашей модели.

В Laravel 5.2 вы можете установить для общедоступного поля $timestamps значение false следующим образом:

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

Или вы можете передать параметры в качестве параметра функции save() :

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

Для более глубокого понимания того, как это работает, вы можете взглянуть на класс \Illuminate\Database\Eloquent\Model в методе 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(); } // [...] 

Поля timestamps обновляются только в том случае, если timestamps публичной собственности равны true или Arr::get($options, 'timestamps', true) возвращает true (что делает это по умолчанию, если массив $options не содержит timestamps ключа).

Как только одно из этих двух возвращает false , поля timestamps не обновляются.

Над образцами работает классно, но только для одного объекта (только одна строка за раз).

Это простой способ временного отключения временных меток, если вы хотите обновить всю коллекцию.

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

Теперь вы можете просто называть что-то вроде этого:

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

Для пользователей Laravel 5.x, которые пытаются выполнить вызов Model::update() , чтобы заставить его работать, вы можете использовать

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

Поскольку функция Model :: update больше не принимает второй аргумент. ref: laravel 5.0 api

Протестировано и работает над версией 5.2.

Я столкнулся с ситуацией, когда вам нужно сделать массовое обновление, которое связано с объединением, поэтому updated_at вызывает дублирование конфликтов столбцов. Я исправил его с помощью этого кода, не требуя области:

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

Вы также можете использовать этот синтаксис:

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

Если вам нужно обновить отдельные запросы модели :

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

или

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

Если вам необходимо обновить несколько запросов модели, используйте

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

вместо

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