Not*_*ale 2 laravel eloquent laravel-5 laravel-5.3
我有一个 Eloquent 模型,我想在其上增加一个属性。到目前为止,我一直在使用以下代码行来实现此目的:
Thread::where('id', $threadId)->increment('like_count');
Run Code Online (Sandbox Code Playgroud)
然而,这会带来更新时间戳的副作用updated_at。我发现了以下更新记录而不更改时间戳的方法:
$thread = Thread::where('id', $threadId)->first();
$thread->timestamps = false;
$thread->like_count++;
$thread->save();
Run Code Online (Sandbox Code Playgroud)
但这突然看起来不太简洁。因此,我想知道有一种方法可以在increment不更新时间戳的情况下使用该方法。
如果您根本不需要时间戳,您可以使用以下命令为该特定模型一次性禁用它:
public $timestamps = false;在你的模型里面。这将添加额外的步骤,每当您想要更新时间戳时,您需要手动为它们分配值,例如$object->created_at = Carbon::now()
其次,如果您希望禁用特定查询,那么正如您在问题中提到的那样,这是一种方法。
另一种方法是使用查询生成器。现在时间戳是与 Eloquent 相关的功能。但是,如果您使用简单查询生成器进行更新,它不会自行更新时间戳。
所以你可以这样做:
DB::table('threads')
->where('id', $threadId)
->update([ 'votes' => DB::raw('votes + 1') ]);
Run Code Online (Sandbox Code Playgroud)
然而,如果有选择的话,我个人更喜欢使用 Eloquent 的方式来做到这一点。
更新
您现在可以将附加参数传递给增量函数来指定您想要更新的其他列。
所以这将变成:
$thread = Thread::find($threadId);
$thread->increment('votes', 1, [
'updated_at' => $thread->updated_at
]);
Run Code Online (Sandbox Code Playgroud)
小智 5
旧线程,但使用 laravel 7 和 php7.4 你可以做
Thread::where('id', $threadId)
->where(fn($q) => $q->getModel()->timestamps = false)
->increment('like_count');
Run Code Online (Sandbox Code Playgroud)
旧版本的 php:
Thread::where('id', $threadId)
->where(function($q) {$q->getModel()->timestamps = false;})
->increment('like_count');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1937 次 |
| 最近记录: |