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

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_TIMESTAMP
  • updated_at 设置为 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    这样即使模型没传值,数据库也会自动填充时间戳。不过要注意和Laravel的自动时间戳逻辑保持一致,避免后续更新时出现冲突。

额外排查点

最后可以确认下你的Calendar模型里有没有开启时间戳:

class Calendar extends Model
{
    // 默认是true,如果被改成false的话,任何情况下都不会自动填充时间戳
    public $timestamps = true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:01:52