You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel的updateOrInsert中保留created_at不更新?

解决方案

直接用updateOrInsert没法实现你的需求,因为这个方法在更新时会把第二个参数里的所有字段都覆盖掉——要是把created_at放进第二个参数,更新时会把已有的created_at改成当前时间,不符合你“更新时不修改”的要求;要是放进第一个参数,查找条件里带created_at,基本每次都会触发插入逻辑,也不对。

正确的做法是拆成两步:先尝试更新符合条件的记录,要是没更新到任何行,再执行插入操作,这样就能精准控制created_at只在首次插入时设置:

// 先尝试更新匹配条件的记录
$updatedRows = DB::table('some_table')
    ->where('user_id', 11)
    ->where('comment_type', 4)
    ->where('last_update', '>=', now()->subMinutes(5))
    ->update(['last_update' => now()]);

// 如果没有更新到任何行,插入新记录并设置created_at
if ($updatedRows === 0) {
    DB::table('some_table')->insert([
        'user_id' => 11,
        'comment_type' => 4,
        'last_update' => now(),
        'created_at' => now()
    ]);
}

这样写的逻辑和你原来的updateOrInsert完全一致,但能保证created_at只会在插入新记录时被设置,后续更新操作不会改动它。

内容的提问来源于stack exchange,提问作者pileup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:52:19