如果我运行$collection->filter(myFilter)
,Laravel会为集合中的每个模型添加密钥这样烦人的事情:
{
"4": {
"myObject": "data"
},
"7": {
"myObject": "data"
}
}
我怎样才能摆脱" 4"和" 7"所以它是我的一系列物体?
我运行的代码是:
$obj = Cars::with('brand')->orderBy('id')->get();
return $obj->filter(function($value, $key)
{
return $value->display == true;
});
答案 0 :(得分:19)
问题是filter()
方法不会重新生成基础集合数组。所以,Collection仍然代表一个数组,只是你的数组看起来像这样:
[
4 => Object4,
7 => Object7,
]
虽然这是PHP中完全有效的数组,但这不是JSON中的正确数组。由于这不能在JSON中表示为数组,因此它将转换为JSON中的对象。
为了在JSON中将其正确表示为数组,您只需要重新生成Collection数组。适当的方法是values()
方法。它只是在底层数组上调用array_values
。这将在上面转换上面的数组:
[
0 => Object4,
1 => Object7,
]
现在,这是一个正确的数字索引数组,JSON可以理解并将其视为数组而不是对象。
虽然flatten
可能适用于此特定情况(您的集合是Eloquent模型的集合),但它实际上并不是正确的方法,并且可能导致意外后果。此外,它还将执行许多不需要的额外逻辑。您最好的选择是使用正确的方法来实现您想要实现的目标,这就是values()
方法。
$obj = Cars::with('brand')->orderBy('id')->get();
return $obj->filter(function($value, $key)
{
return $value->display == true;
})
->values();
答案 1 :(得分:2)
在您的收藏集上调用flatten()
应删除密钥并将其所有值合并到一个集合中。