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

Laravel 5.5 Inconsistent JSON when using filter on a collection

我正在为我正在进行的项目构建一个简单的搜索。它在大多数情况下工作得很好。我 运行 在使用 ->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);

这里是 UserResource 中的 toArray 函数:

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() 函数的范围。但这是不一致的。在格式 B 的搜索词 san 上它 returns 但在格式 A 的搜索词 pha 上它 returns。如果删除一切正常并以正确的格式返回(格式 A).

如果缺少任何代码可以帮助让我知道,因为我不确定需要包含哪些内容。

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

使用 values() 函数重新排序集合并正确地 returns JSON 作为 { data: [{..},{..}] }