Laravel使用insert批量插入数据时created_at、updated_at字段为空问题
为什么批量插入时created_at和updated_at为null?
嘿,这个问题我之前做批量数据导入的时候也踩过坑!核心原因其实很简单:
Laravel模型的自动时间戳(created_at/updated_at)是通过模型的生命周期方法和事件来自动填充的,但你用的insert()方法本质是直接调用了数据库查询构造器,它绕开了模型的逻辑层,不会触发任何模型事件或自动赋值逻辑,所以这两个字段自然就没有值,变成null了。
解决办法有这几种,你可以根据场景选:
1. 手动在数据数组中添加时间戳字段
这是最直接高效的方式,适合批量插入的场景,性能不会受影响:
use Carbon\Carbon; // 给每个数据项手动添加上时间戳 $data = [ [ 'weekday' => 1, 'status' => 'active', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now() ], // 其他批量数据... ]; $calendar->insert($data);
如果你的Laravel版本支持,也可以用now()辅助函数代替Carbon:now()
2. 循环调用模型的create()方法(数据量小的时候用)
如果你数据量不大,想利用模型的自动填充逻辑,可以循环遍历数据,逐个调用create():
foreach ($data as $item) { Calendar::create($item); }
⚠️ 注意哈:这种方式会给每一条数据发起一次数据库请求,数据量大的时候会严重影响性能,所以批量插入优先选第一种方法。
3. 数据库层面设置默认值(兜底方案)
你也可以直接在数据库表结构里给created_at和updated_at设置默认值:
created_at设置为DEFAULT CURRENT_TIMESTAMPupdated_at设置为DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
这样即使模型没传值,数据库也会自动填充时间戳。不过要注意和Laravel的自动时间戳逻辑保持一致,避免后续更新时出现冲突。
额外排查点
最后可以确认下你的Calendar模型里有没有开启时间戳:
class Calendar extends Model { // 默认是true,如果被改成false的话,任何情况下都不会自动填充时间戳 public $timestamps = true; }
内容的提问来源于stack exchange,提问作者Davit Zeynalyan
相关产品推荐
相关产品推荐

