使用$ collection-> filter()过滤Eloquent集合数据

Ten*_*oru 41 laravel eloquent laravel-4

我正在尝试使用collection filter()方法过滤以下集合:

$collection = Word::all();
Run Code Online (Sandbox Code Playgroud)

JSON输出如下所示:

[
{
"id": "1",
"word": "dog",
"phonetic": "dog",
"mean": "pies",
"assoc": "some example text",
"author_id": "3",
"user_id": "3"
},
{
"id": "2",
"word": "sun",
"phonetic": "sun",
"mean": "s?o?ce",
"assoc": "lorem ipsun dolor sit amet",
"author_id": "3",
"user_id": "2"
}, ...
]
Run Code Online (Sandbox Code Playgroud)

但是,在过滤集合时:

$filtered_collection = $collection->filter(function($item)
    {
        if($item->isDog())
        {
            return $item;
        }
 });
Run Code Online (Sandbox Code Playgroud)

过滤后的集合JSON输出如下所示:

 {"1":
 {
 "id": "1",
 "word": "dog",
 "phonetic": "dog",
 "mean": "pies",
 "assoc": "some example text",
 "author_id": "3",
 "user_id": "3"
 },
 "2":
 {
 "id": "2",
 "word": "sun",
 "phonetic": "sun",
 "mean": "s?o?ce",
 "assoc": "lorem ipsun dolor sit amet",
 "author_id": "3",
 "user_id": "2"
 }}
Run Code Online (Sandbox Code Playgroud)

过滤集合时如何保留原始JSON输出?在过滤原始集合时,我想要一个我的Eloquent模型实例数组.提前致谢 :)

Jos*_*ber 104

集合的filter方法调用array_filter底层数组,根据PHP文档,它保留数组键.然后,这会导致您的数组转换为JavaScript对象而不是数组.

调用values()您的集合以重置基础数组上的键:

$filtered_collection = $collection->filter(function ($item) {
    return $item->isDog();
})->values();
Run Code Online (Sandbox Code Playgroud)

  • 这个答案就是人们来到这个网站的原因。哇 (4认同)

tot*_*dli 8

只需将其转换为JSON,并记住Laravel文档中的内容:

注意:过滤集合并将其转换为JSON时,请先尝试调用values函数以重置数组的键.

所以最终的代码是:

$filtered_collection->values()->toJson();
Run Code Online (Sandbox Code Playgroud)

  • 不赞成的人很快就可以反对,但从不想提供理由 (3认同)
  • downvoter会愿意给出解释吗?这是正确的答案,与接受/赞成的其他答案完全相同,只是措辞更好。 (2认同)