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

Laravel9+jenssegers/mongodb3:如何用insert方法设置MongoDB日期值?

Laravel 9 + Jenssegers MongoDB 3 日期插入问题解决

问题根源

  • published_at 显示为null:$faker->dateTimeBetween 返回的是标准PHP DateTime对象,不存在date属性,所以!empty($published_at->date)永远为false,最终赋值为null。
  • created_at 显示为{}:代码中仅定义了$todayEnd,未定义$todayStart;且直接传递Carbon对象时,未正确触发MongoDB日期类型转换,导致被序列化为空对象。

正确写法

1. 修复 published_at

直接传递DateTime对象即可,jenssegers/mongodb会自动将其转换为MongoDB的ISODate类型;也可以转为Carbon对象,更适配Laravel生态:

$published_at = $faker->dateTimeBetween('-200 days', 'now', config('app.timezone'));

// 方式1:直接使用DateTime对象
'published_at' => $published_at,

// 方式2:转换为Carbon对象(推荐)
'published_at' => Carbon::instance($published_at),

2. 修复 created_at

先补全$todayStart的定义,再传递Carbon对象:

// 示例:定义为当天的开始时间
$todayStart = Carbon::now(config('app.timezone'))->startOfDay();

'created_at' => $todayStart,

完整示例代码

$published_at = $faker->dateTimeBetween('-200 days', 'now', config('app.timezone'));
$todayStart = Carbon::now(config('app.timezone'))->startOfDay();
$todayEnd = Carbon::now(config('app.timezone'));

$data[] = [
    // 其他字段...
    'published_at' => Carbon::instance($published_at),
    'created_at' => $todayStart,
];

额外提醒

  • Jenssegers MongoDB 3.x 原生支持Carbon和DateTime对象,会自动转换为ISODate类型,无需手动格式化字符串,这样能保留MongoDB日期类型的查询优势(如范围查询)。
  • 如果非要手动转换为字符串,使用->toIso8601String()方法,不要访问不存在的对象属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:27:49