80

是否可以在不触及时间戳的情况下更新用户?

我不想完全禁用时间戳..

格兹

4

9 回答 9

175

暂时禁用它:

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

您可以选择在保存后重新启用它们。

这是 Laravel 4 和 5 独有的功能,不适用于 Laravel 3。

于 2013-09-19T23:02:33.017 回答
28

在 Laravel5.2中,您可以将公共字段设置$timestampsfalse

$user->timestamps = false;
$user->name = 'new name';
$user->save();

或者您可以将选项作为save()函数的参数传递:

$user->name = 'new name';
$user->save(['timestamps' => false]);

为了更深入地了解它的工作原理,您可以查看 class \Illuminate\Database\Eloquent\Model,在 method 中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等于trueArr::get($options, 'timestamps', true)返回时才会更新时间戳字段true(如果$options数组不包含键,默认情况下会这样做timestamps)。

只要这两个返回之一falsetimestamps字段就不会更新。

于 2016-03-08T05:59:30.257 回答
18

添加到安东尼奥·卡洛斯·里贝罗的回答

如果您的代码需要超过 50% 的时间停用时间戳 - 也许您应该禁用自动更新并手动访问它。

在 eloquent 中,当您扩展 eloquent 模型时,您可以通过放置

更新

public $timestamps = false;

在你的模型里面。

于 2014-04-25T12:43:51.737 回答
18

上面的示例很酷,但仅适用于单个对象(每次仅一行)。

如果您想更新整个集合,这是一种临时禁用时间戳的简单方法。

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')));
于 2016-08-16T03:33:17.497 回答
12

如果您需要更新单个模型查询:

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

或者

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

如果您需要更新多个模型查询,请使用

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

代替

Product::...->update(...)
于 2017-11-17T10:53:46.503 回答
10

对于尝试执行Model::update()呼叫的 Laravel 5.x 用户,要使其正常工作,您可以使用

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

由于 Model::update 函数不再接受第二个参数。参考:laravel 5.0 api

经过测试并在 5.2 版上工作。

于 2017-03-03T16:55:39.600 回答
5

我遇到了需要进行涉及连接的大规模更新的情况,因此updated_at导致了重复的列冲突。我用这段代码修复了它,不需要范围:

$query->where(function (\Illuminate\Database\Eloquent\Builder $query) {
    $query->getModel()->timestamps = false;
})
于 2017-03-26T20:28:36.903 回答
4

对于 Larvel 5.1,您还可以使用以下语法:

Model::where('Y', 'X')
    ->update(['Y' => 'Z'], ['timestamps' => false]);
于 2017-02-15T14:59:56.120 回答
-1

拉拉维尔 8

使用播种机进行一些覆盖,在一项测试中我有:

$item = Equipment::where('name', item_name))->first();
$item->description = 'some description';
$item->save(['timestamps' => false]);

哪个工作正常,但如果我使用,firstOrNew那么$item->save(['timestamps' => false]);它不起作用。

// This does not work on Seeder file
$item = Model::firstOrNew(['name' => 'item_name']);
$item->description = 'some description';
$item->save(['timestamps' => false]);

// Doing the following works tho
$item = Model::firstOrNew(['name' => 'item_name']);
$item->description = 'some description';
$item->timestamps = false;
$item->save();

因此,在某些情况下,您会使用其中一个...只需检查 die 和 dump 以查看是否+timestamps: false

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

或者

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

编辑:在我的项目中,我选择使用$item->timestamps = false;,所以我也建议使用它。这是来自 laravelplayground 的工作片段: https ://laravelplayground.com/#/snippets/4ae950f2-d057-4fdc-a982-34aa7c9fee15

检查 Laravel api 上的 HasTimestamps: https ://laravel.com/api/8.x/Illuminate/Database/Eloquent/Concerns/HasTimestamps.html

以及模型上的保存方法: https ://laravel.com/api/8.x/Illuminate/Database/Eloquent/Model.html

save 方法仍然接受选项,但传递时间戳将不起作用。

于 2021-09-02T02:04:35.353 回答