7

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

2 回答 2

24

问题是该filter()方法不会重新设置底层集合数组的密钥。所以,Collection 仍然代表一个数组,只是你的数组看起来像这样:

[
    4 => Object4,
    7 => Object7,
]

虽然这在 PHP 中是一个完全有效的数组,但在 JSON 中这不是一个正确的数组。由于这不能在 JSON 中表示为数组,因此将其转换为 JSON 中的对象。

为了将它正确地表示为 JSON 中的数组,您只需重新设置 Collection 数组的键。正确的方法就是values()方法。它所做的只是调用array_values底层数组。这将把上面的数组变成这样:

[
    0 => Object4,
    1 => Object7,
]

现在,这是一个正确的数字索引数组,JSON 可以理解并将其视为数组而不是对象。

虽然flatten可能适用于这种特殊情况(您的 Collection 是 Eloquent 模型的集合),但它实际上不是正确的方法,并且可能会导致意想不到的后果。此外,它将执行许多不需要的额外逻辑。您最好的选择是使用正确的方法来实现您想要实现的目标,这就是values()方法。

$obj = Cars::with('brand')->orderBy('id')->get();

return $obj->filter(function($value, $key)
    {
        return $value->display == true;
    })
    ->values();
于 2017-02-12T01:10:09.190 回答
5

调用flatten()您的集合应该删除键并将它们的所有值合并到一个集合中。

于 2017-02-12T00:49:21.770 回答