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

mdfafbf1  于 2022-12-24  发布在  其他
关注(0)|答案(4)|浏览(269)

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

$collection = Word::all();

其中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"
}, ...
]

但是,在筛选集合时:

$filtered_collection = $collection->filter(function($item)
    {
        if($item->isDog())
        {
            return $item;
        }
 });

过滤后的集合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"
 }}

在过滤一个集合的时候,我怎样才能保留原始的JSON输出呢?我希望在过滤原始集合的时候有一个我的Eloquent模型示例的数组。

7uhlpewt

7uhlpewt1#

集合的filter方法调用底层数组的array_filteraccording to the PHP docs保留了数组键,这将导致数组转换为JavaScript对象而不是数组。
在集合上调用values()以重置基础数组上的键:

$filtered_collection = $collection->filter(function ($item) {
    return $item->isDog();
})->values();
    • 附注**:在Laravel的更新版本中,您可以使用更高阶的消息将上述内容缩短为:
$filtered_collection = $collection->filter->isDog()->values();
9o685dep

9o685dep2#

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

**注意:**当过滤一个集合并将其转换为JSON时,尝试首先调用values函数来重置数组的键。

所以最后的代码应该是:

$filtered_collection->values()->toJson();
holgip5t

holgip5t3#

从数据库中过滤也可以用这种方法完成。

//request the form value 
  $name=$request->name;
  $age=$request->age;
  $number=$request->phone;

 //write a query to filter
 $filter_result = DB::table('table_name')

 ->where('name', 'like', '%'.$name.'%')
 ->orWhere('age', 'like', '%'.$age.'%')
 ->orWhere('phone', 'like', '%'.$number.'%')

 ->get();

 if(is_null($filter_result)){
 return redirect()->back()->with('message',"No Data Found");

}else{
      return view('resultpage',compact('filter_result'));
}
6kkfgxo0

6kkfgxo04#

如果你有雄辩的集合数组,你想从一些属性过滤它,你可以尝试下面的过滤器来实现这一点。
在我的例子中,$reports是包含雄辩集合对象的变量。我想用id属性从这个集合中过滤。

$filter_id = $reports->filter(function ($item) {
   return $item->id==5;
})->first();

现在你有了包含id=5的对象的**$filter_id**变量。
您可以访问id=5所有属性,例如$filter_id-〉attribute_name。

相关问题