Laravel集合在each遍历中调用union方法无法插入新集合问题
问题原因
你误用了Laravel Collection的union()方法,该方法的合并逻辑和PHP原生数组的+运算符完全一致:仅保留原集合中不存在的键对应的元素,相同键名的元素会直接被忽略,不会覆盖也不会追加。
你每次筛选得到的$_availabaleSlices都是单元素集合,元素的索引均为0。第一次合并后slices集合已经存在索引为0的元素,第二次合并时新集合的索引0已存在,所以第二条记录直接被丢弃,最终仅保留第一条数据。
解决方法
你需要的是忽略原有索引,直接追加新集合的所有元素,可以替换为以下任意一种方案:
方案1:使用concat()方法(推荐)
concat()方法会忽略集合的原有索引,将新集合的所有元素追加到原集合末尾,完全符合你的需求,只需修改对应行即可:
$slices = $slices->concat($_availabaleSlices);
方案2:使用merge()方法
对于数字索引的集合,merge()方法同样会自动重排索引、追加新元素,效果和concat()一致:
$slices = $slices->merge($_availabaleSlices);
方案3:更简洁的写法(无需手动声明集合+遍历)
直接用flatMap替代each,可以省略手动初始化集合、合并的步骤,代码更简洁易读:
$slices = Means::whereIn('id', $meansId) ->get() ->flatMap(function ($mean) use ($weight) { return $mean->slices() ->betweenWeight($weight) ->get(); }); dd('RESULTS', $slices->toArray());
内容的提问来源于stack exchange,提问作者Stanislas Poisson
相关产品推荐
相关产品推荐

