我正在尝试使用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模型实例数组 。 在此先感谢:)
答案 0 :(得分:98)
集合的filter
方法在底层数组上调用array_filter
,according to the PHP docs保留数组键。这会导致您的数组转换为JavaScript对象而不是数组。
调用集合上的values()
以重置基础数组上的键:
$filtered_collection = $collection->filter(function ($item) {
return $item->isDog();
})->values();
答案 1 :(得分:6)
只需将其转换为JSON,并牢记Laravel documentation状态:
注意:过滤集合并将其转换为JSON时,请先尝试调用values函数重置数组的键。
所以最终的代码是:
$filtered_collection->values()->toJson();
答案 2 :(得分:0)
也可以通过这种方法从数据库中进行过滤。
//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'));
}