Возможно ли обновить пользователя, не касаясь временных меток?Обновление без касания временных меток (Laravel)
Я не хочу, чтобы отключить временные метки укомплектовать ..
grtz
Возможно ли обновить пользователя, не касаясь временных меток?Обновление без касания временных меток (Laravel)
Я не хочу, чтобы отключить временные метки укомплектовать ..
grtz
временно отключить:
$user = User::find(1);
$user->timestamps = false;
$user->age = 72;
$user->save();
При необходимости можно повторно включить их после сохранения.
Это Laravel 4 и 5 только особенность и не относятся к Laravel 3.
Чтобы добавить ответ Антонио Карлоса Рибейро
Если код требует меток времени деактивации более чем на 50% времени - возможно, вы должны отключить автоматическое обновление и вручную получить к нему доступ.
В красноречивым, когда вы расширяете красноречивое модель можно отключить, поставив метки
UPDATE
public $timestamps = false;
внутри вашей модели.
Это не сработало для меня, мне пришлось делать 'public $ timestamps = false;' –
Когда я добавляю это шоу laravel, я ERROR – M98
исправил свой ответ на то, что заявил @JonathanEllis - его теперь публичное свойство – azngunit81
В 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
не обновляются.
Обратите внимание, что эта функциональность нарушается в Laravel 5.1 и 5.2 и поэтому * удаляется * из Laravel 5.3. Смотрите: https://github.com/laravel/framework/issues/10028 – hackel
Выше образцов работает классно, но только для одного объекта (всего одна строка за раз).
Это простой способ временного отключения временных меток, если вы хотите обновить всю коллекцию.
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')));
Вы также можете использовать этот синтаксис:
Model::where('Y', 'X')
->update(['Y' => 'Z'], ['timestamps' => false]);
Для пользователей Laravel 5, которые пытаются выполнить 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;
})
Если вам необходимо обновить единой модели запросы:
$product->timestamps = false;
$product->save();
или
$product->save(['timestamps' => false]);
Если вам необходимо обновить множественная модель запросы
DB::table('products')->...->update(...)
вместо
Product::...->update(...)
Там нет никакого способа, чтобы отменить временные метки по умолчанию. Я не уверен, но вы пробовали DB :: raw ($ yourRawQuery)? – Arda