在集合上使用过滤器时,Laravel 5.5不一致的JSON

时间:2017-11-30 22:04:55

标签: php laravel laravel-5 laravel-5.5

我正在构建一个简单的搜索我正在进行的项目。它在大多数情况下工作得相当好。使用->filter(function($item) { .. })时,我遇到了一个问题。

以下是代码:

$users = App\User::select(['id', 'username', 'preferred_first_name', 'preferred_last_name'])
        ->where('username', 'like', $like)
        ->orWhere('preferred_first_name', 'like', $like)
        ->orWhere('preferred_last_name', 'like', $like)
        ->orWhere('id', $query)
        ->get();
$users = $users->filter(function($item) {
    return !$item->is_terminated();
});
return UserResource::collection($users);

以下是toArray中的UserResource函数:

public function toArray($request)
{
    return [
        'id' => $this->id,
        'username' => $this->username,
        'full_name' => $this->full_name,
    ];
}

我遇到的问题是一些JSON以两种不同的格式返回:

格式A:{ data: [ {..}, {..}, .. ] }
格式B:{ data: {"0": {..}, "1":{..},..} }

我希望所有的JSON都能一直以格式A返回。我已将其缩小filter()功能。但这是不一致的。在搜索词san上,它以格式B返回,但在术语pha上以格式A返回。如果删除,则一切正常,并以适当的格式返回(格式A)。

如果有任何代码丢失,可以帮助我了解,因为我不确定需要包含哪些内容。

1 个答案:

答案 0 :(得分:0)

filter()函数保留最初检索它的集合的顺序。在我的情况下,过滤后的集合数组将是: [3 => {}, 25 => {},..]。我不知道Laravel用来输出这个数组作为对象({data: { "3": {..}, "25": {..},..} })的原因/逻辑,但确实如此。我似乎无法在文档中找到任何内容。如果有人对此有特定的答案那就太棒了。我认为它与跳过键有关 - 从3到25。

使用values()函数重新对集合进行排序,并将JSON正确地返回为{ data: [{..},{..}] }