Laravel使用push为MongoDB创建空数组字段时出现多余嵌套子数组问题
问题原因
你用错方法了。push 底层对应MongoDB的$push操作符,核心作用是向已有数组字段追加元素,根本不是用来初始化字段的。你传入空数组[]作为要追加的值时,MongoDB会把这个空数组当成单个元素存进去,自然就得到了productC: [[]]的双层嵌套结构。
解决方案
方案1:直接属性赋值初始化(最简便)
不需要调用push,判断字段不存在时直接给嵌套属性赋值为空数组,再调用save()持久化即可:
public function addFieldByUser($id) { $product = Product::find($id); if (empty($product)) { abort(404); } if (!isset($product->image['productC'])) { $image = $product->image; $image['productC'] = []; $product->image = $image; $product->save(); } }
方案2:使用$set原子操作初始化
如果不想做全量save,也可以通过MongoDB的$set操作符直接原子更新字段值,对应Laravel MongoDB包的写法如下:
public function addFieldByUser($id) { $product = Product::find($id); if (empty($product)) { abort(404); } if (!isset($product->image['productC'])) { $product->update([ '$set' => ['image.productC' => []] ]); } }
存量错误数据修复
如果库中已经存在productC为[[]]的错误数据,可以执行一次批量更新修复:
// 把所有错误嵌套的productC字段修正为空数组 Product::where('image.productC', [[]])->update([ 'image.productC' => [] ]);
注意事项
等productC被正确初始化为空数组之后,后续需要往数组内追加元素时,再调用push()方法就可以正常工作,不会再出现嵌套数组的问题。
内容的提问来源于stack exchange,提问作者Miedkes
相关产品推荐
相关产品推荐

