Laravel 5.5保存不更新timestamp两种写法效果差异原因问询
Laravel 5.5 两种关闭时间戳更新写法的差异说明
核心原因
两种写法的效果差异完全由Laravel 5.5本身的Eloquent底层实现逻辑决定:
方法1无效的原因
save() 方法接收的$options数组在Laravel 5.5版本中,没有内置处理timestamps参数的对应逻辑。你传入的['timestamps' => false]仅会被识别为普通自定义选项,不会触发跳过时间戳自动更新的逻辑,因此保存时updated_at等时间戳字段仍会被自动修改。
对应代码:
$manual_ticket->status = "Queued"; $manual_ticket->initiator_id = null; $manual_ticket->save(['timestamps' => false]); // 该写法在Laravel5.5中不生效
方法2生效的原因
$timestamps 是Eloquent模型的内置公共属性,当你直接将该属性赋值为false时,模型在执行保存逻辑前会优先读取该属性的取值:如果为false,会直接跳过created_at/updated_at等时间戳字段的自动更新逻辑,因此能实现你要的不改动时间戳的需求。
对应代码:
$manual_ticket->status = "Queued"; $manual_ticket->initiator_id = null; $manual_ticket->timestamps = false; $manual_ticket->save(); // 该写法在Laravel5.5中生效
补充说明
如果你需要临时关闭时间戳更新后再恢复默认行为,可以在保存完成后重新将$timestamps属性赋值为true即可:
$manual_ticket->timestamps = false; $manual_ticket->save(); $manual_ticket->timestamps = true;
内容的提问来源于stack exchange,提问作者Yeo Bryan
相关产品推荐
相关产品推荐

