タイムスタンプに触れずにユーザーを更新することはできますか?
タイムスタンプを完全に無効にしたくありません..
グッツ
Laravelでは、 public フィールドを次のように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
タイムスタンプ フィールドは、public プロパティが等しいtrue
か、Arr::get($options, 'timestamps', true)
返された場合にのみ更新されます (配列に key が含まれていないtrue
場合、デフォルトで更新されます)。$options
timestamps
これら 2 つのいずれかが を返すとすぐfalse
に、timestamps
フィールドは更新されません。
アントニオ・カルロス・リベイロの答えに追加するには
コードで 50% 以上の時間でタイムスタンプの非アクティブ化が必要な場合は、自動更新を無効にして手動でアクセスする必要があります。
雄弁なモデルを拡張すると、雄弁にタイムスタンプを無効にすることができます
アップデート
public $timestamps = false;
モデル内。
呼び出しを実行しようとしているLaravel 5.xユーザーのModel::update()
場合、それを機能させるために使用できます
Model::where('example', $data)
->update([
'firstValue' => $newValue,
'updatedAt' => \DB::raw('updatedAt')
]);
Model::update 関数はもう 2 番目の引数を取りません。参照:laravel 5.0 API
バージョン 5.2 でテストされ、動作しています。
結合を伴う一括更新を行う必要がある状況に遭遇したため、updated_at
重複する列の競合が発生していました。スコープを必要とせずにこのコードで修正しました:
$query->where(function (\Illuminate\Database\Eloquent\Builder $query) {
$query->getModel()->timestamps = false;
})
Larvel 5.1 では、次の構文も使用できます。
Model::where('Y', 'X')
->update(['Y' => 'Z'], ['timestamps' => false]);