如何在Laravel MongoDB中批量更新日期字段?
解决Laravel MongoDB批量更新日期字段的问题
问题根源
Laravel MongoDB的批量update方法直接通过查询构造器执行,不会触发模型的属性转换逻辑(也就是$dates数组的处理逻辑)。所以直接传Carbon实例会报错,转成字符串又会存成字符串类型;而循环保存虽然能正确存储,但会产生大量数据库请求,性能太差。
方案一:用MongoDB原生$currentDate操作符(推荐)
如果只是要将字段设为当前时间,直接用MongoDB自带的$currentDate操作符,这是原子操作,效率最高,且存储的是MongoDB原生Date类型:
Device::whereIn('serial_number', $serialNumbers)->update([ '$currentDate' => [ 'status_updated_at' => true ] ]);
方案二:自定义时间时用UTCDateTime包装
如果需要设置指定的时间(而非当前服务器时间),可以用Laravel MongoDB底层依赖的MongoDB\BSON\UTCDateTime类来包装时间:
use MongoDB\BSON\UTCDateTime; // 将Carbon时间转成毫秒级时间戳,UTCDateTime要求传入毫秒格式 $targetTime = new UTCDateTime(Carbon::now()->getTimestamp() * 1000); Device::whereIn('serial_number', $serialNumbers)->update([ 'status_updated_at' => $targetTime ]);
内容的提问来源于stack exchange,提问作者D'Arcy Rail-Ip
相关产品推荐
相关产品推荐

