如何在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
相关产品推荐
相关产品推荐

