一尘不染

Laravel集合将数组转换为对象

json

如果我运行$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;
});

阅读 2296

收藏
2020-07-27

共1个答案

一尘不染

问题在于该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();
2020-07-27