Laravel雄辩的增量,无需更新时间戳

问题描述 投票:0回答:3

我有一个雄辩的模型,我想在该模型上增加单个属性。到目前为止,我一直在使用以下代码行来实现这一点:

Thread::where('id', $threadId)->increment('like_count');

然而,这具有更新updated_at时间戳的不良副作用。我发现了以下更改记录而不更改时间戳的方法:

    $thread = Thread::where('id', $threadId)->first();

    $thread->timestamps = false;
    $thread->like_count++;
    $thread->save();

但是突然之间看起来不够简洁。因此,我想知道有一种无需更新时间戳即可使用increment方法的方法。

laravel laravel-5 eloquent laravel-5.3
3个回答
4
投票

如果完全不需要时间戳,则可以使用:对该特定模型全部禁用一次:

public $timestamps = false;在您的模型中。这将增加额外的步骤,每当您希望更新时间戳时,都需要手动为其分配值,例如$object->created_at = Carbon::now()

第二,如果您希望针对特定查询禁用这些功能,那么就像您在问题中提到的那样,是一种方法。

另一种方法是使用查询生成器。现在,时间戳是与Eloquent相关的功能。但是,如果您使用简单的查询生成器进行更新,则它不会自行更新时间戳。

所以您可以做:

DB::table('threads')
            ->where('id', $threadId)
            ->update([ 'votes' => DB::raw('votes + 1') ]);

但是,如果可以选择的话,我个人更喜欢使用口才的方法。


1
投票

您可以将整个过程封装到模型的一种方法中。


0
投票

旧线程,但可以使用laravel 7和php7.4

Thread::where('id', $threadId)
->where(fn($q) => $q->getModel()->timestamps = false)
->increment('like_count');

旧版本的php:

Thread::where('id', $threadId)
->where(function($q) {$q->getModel()->timestamps = false;})
->increment('like_count');
© www.soinside.com 2019 - 2024. All rights reserved.