タイムスタンプを変更せずにユーザーを更新することは可能ですか?
タイムスタンプを完全に無効にしたくありません。
グリッツ
一時的に無効にします:
$user = User::find(1);
$user->timestamps = false;
$user->age = 72;
$user->save();
オプションで、保存後にそれらを再度有効にすることができます。
これはLaravel 4および5のみの機能であり、Laravel 3。
Laravel _5.2
_)では、パブリックフィールド_$timestamps
_を次のようにfalse
に設定できます。
_$user->timestamps = false;
$user->name = 'new name';
$user->save();
_
または、オプションをsave()
関数のパラメーターとして渡すことができます。
_$user->name = 'new name';
$user->save(['timestamps' => false]);
_
それがどのように機能するかをより深く理解するには、メソッドperformUpdate(Builder $query, array $options = [])
でクラス_\Illuminate\Database\Eloquent\Model
_を見ることができます:
_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
)。
これら2つのいずれかがfalse
を返すとすぐに、timestamps
フィールドは更新されません。
アントニオカルロスリベイロの答えに追加するには
コードで50%以上のタイムスタンプの非アクティブ化が必要な場合は、自動更新を無効にして手動でアクセスする必要があります。
雄弁で雄弁なモデルを拡張すると、タイムスタンプを無効にすることができます
[〜#〜] update [〜#〜]
public $timestamps = false;
モデル内。
上記のサンプルはクールに動作しますが、1つのオブジェクトに対してのみ(時間ごとに1行のみ)。
これは、コレクション全体を更新する場合にタイムスタンプを一時的に無効にする簡単な方法です。
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関数はもう2番目の引数をとらないので。 ref: laravel 5.0 api
バージョン5.2でテストおよび動作しています。
単一モデルクエリを更新する必要がある場合:
$product->timestamps = false;
$product->save();
または
$product->save(['timestamps' => false]);
複数モデルクエリを更新する必要がある場合
DB::table('products')->...->update(...)
の代わりに
Product::...->update(...)
結合を伴う大量更新を行う必要がある状況に遭遇したので、updated_at
は、重複した列の競合を引き起こしていました。スコープを必要とせずにこのコードで修正しました:
$query->where(function (\Illuminate\Database\Eloquent\Builder $query) {
$query->getModel()->timestamps = false;
})
次の構文も使用できます。
Model::where('Y', 'X')
->update(['Y' => 'Z'], ['timestamps' => false]);