web-dev-qa-db-ja.com

タイムスタンプに触れずに更新する(Laravel)

タイムスタンプを変更せずにユーザーを更新することは可能ですか?

タイムスタンプを完全に無効にしたくありません。

グリッツ

53

一時的に無効にします:

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

オプションで、保存後にそれらを再度有効にすることができます。

これはLaravel 4および5のみの機能であり、Laravel 3。

131

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();
    }

    // [...]
_

タイムスタンプフィールドは、パブリックプロパティtimestampstrueに等しいか、Arr::get($options, 'timestamps', true)trueを返す場合にのみ更新されます(_$options_配列がキーを含まないtimestamps)。

これら2つのいずれかがfalseを返すとすぐに、timestampsフィールドは更新されません。

18
Mike

アントニオカルロスリベイロの答えに追加するには

コードで50%以上のタイムスタンプの非アクティブ化が必要な場合は、自動更新を無効にして手動でアクセスする必要があります。

雄弁で雄弁なモデルを拡張すると、タイムスタンプを無効にすることができます

[〜#〜] update [〜#〜]

public $timestamps = false;

モデル内。

14
azngunit81

上記のサンプルはクールに動作しますが、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')));
14

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でテストおよび動作しています。

7
hilnius

単一モデルクエリを更新する必要がある場合:

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

または

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

複数モデルクエリを更新する必要がある場合

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

の代わりに

Product::...->update(...)
4
Luca C.

結合を伴う大量更新を行う必要がある状況に遭遇したので、updated_atは、重複した列の競合を引き起こしていました。スコープを必要とせずにこのコードで修正しました:

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

次の構文も使用できます。

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