2013-09-19 2 views
35

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

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

grtz

+1

Там нет никакого способа, чтобы отменить временные метки по умолчанию. Я не уверен, но вы пробовали DB :: raw ($ yourRawQuery)? – Arda

ответ

89

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

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

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

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

+0

У меня проблемы с этим ...? Не работает, если установлен в базовой модели. У кого-нибудь еще есть проблема? – wnajar

+2

@wnajar Это прекрасно работает со мной –

+0

Можете ли вы вообще объяснить? Все еще не может заставить это работать и кажется глупым. Также использование Laravel 3. – wnajar

12

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

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

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

UPDATE

public $timestamps = false;

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

+1

Это не сработало для меня, мне пришлось делать 'public $ timestamps = false;' –

+0

Когда я добавляю это шоу laravel, я ERROR – M98

+0

исправил свой ответ на то, что заявил @JonathanEllis - его теперь публичное свойство – azngunit81

11

В 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 равна true или Arr::get($options, 'timestamps', true) возвращает true (что он делает по умолчанию, если $options массив не содержит ключ timestamps).

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

+5

Обратите внимание, что эта функциональность нарушается в Laravel 5.1 и 5.2 и поэтому * удаляется * из Laravel 5.3. Смотрите: https://github.com/laravel/framework/issues/10028 – hackel

6

Выше образцов работает классно, но только для одного объекта (всего одна строка за раз).

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

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'))); 
+2

его заказ :: ** w ** ithoutTimestamps(), исправить – Zanshin13

+0

оба случая будут работать –

+3

, но соглашения, стандарты и т. Д. – Zanshin13

2

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

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

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

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

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

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

2

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

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

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

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

или

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

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

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

вместо

Product::...->update(...) 
Смежные вопросы