gpt4 book ai didi

php - 遍历查询构建器实例,删除一些项目然后返回修改后的实例

转载 作者:搜寻专家 更新时间:2023-10-31 21:47:46 26 4
gpt4 key购买 nike

我有一个正在为服务器端搜索/过滤功能构建的查询,我有一个查询构建器实例,每次用户检查新过滤器时都会更改它,一切顺利,直到我有一个检查过滤器对于多对多关系。

首先是我 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com