- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个正在为服务器端搜索/过滤功能构建的查询,我有一个查询构建器实例,每次用户检查新过滤器时都会更改它,一切顺利,直到我有一个检查过滤器对于多对多关系。
首先是我 Controller 中的代码:
public function index()
{
$hotels = (new Hotel)->newQuery();
if (request()->has('category_id')) {
$hotels->whereIn('category_id', request()->category_id);
}
if(request()->has('location_id')) {
$hotels->whereIn('location_id', request()->location_id);
}
if(request()->has('facility_id')) {
$filtered = $hotels->get()->filter(function ($hotel) {
return $hotel->facilities()->whereIn('facility_id', [4])->get()->isNotEmpty();
});
// dd($filtered);
}
request()->flash();
if(count(request()->all())) {
$hotels = $hotels->paginate(2)->appends([
'category_id' => request('category_id'),
'location_id' => request('location_id'),
]);
}
if(! count(request()->all())) {
$hotels = Hotel::inRandomOrder()->paginate(8);
}
return view('hotels', compact('hotels'));
}
这就是问题所在,假设我有 20 条记录,我需要直接修改并从 $hotels
中删除任何空集合(a hotel)匹配 filter() 方法,但发生的是 $hotels
变量与所有 20 条记录保持相同,我必须改为使用新变量,即 $filtered
来从 filtered()
方法中获取修改后的结果,但在那种情况下我无法继续在 $hotels
实例上构建,如果假设我更改了结尾支持新的 $filtered
变量的代码,如果请求中没有 facilities
,我的代码就会中断。
总而言之,这就是我需要的,我需要遍历 $hotels
变量,删除一些项目,然后将 $hotels
作为查询构建器返回以保留以此为基础。
这是我尝试过的:
我尝试了 reduce 方法,它的工作方式几乎与 filter()
类似,我不得不使用一个新变量来获取结果,但是 filter()
更好。
假设“facilities”是我在返回前调用的最后一个查询,我尝试将 $hotels 重新分配给 $filtered,如 $hotels = $filtered
因为我不会不再需要查询构建器了吗?但是在代码的底部我对结果进行了分页,这不起作用,它告诉我 paginate()
方法不存在于我认为收藏。
最佳答案
类似这样的东西
if(request()->has('facility_id')) {
$hotels->whereHas('facilities', function ($query) {
return $query->whereIn('facility_id', [4])->where('facility_id', '<>', '');
});
}
关于php - 遍历查询构建器实例,删除一些项目然后返回修改后的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53649754/
我是一名优秀的程序员,十分优秀!