У меня есть этот запрос, который я создаю для серверной функции поиска / фильтрации, у меня есть экземпляр построителя запросов, который изменяется каждый раз, когда пользователь проверяет новый фильтр, все шло хорошо, пока у меня не было фильтра, который проверяетдля отношений ManyToMany.
Прежде всего, вот код в моем контроллере:
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
любая пустая коллекция ( hotel ), которая не соответствует методу filter (), но в результате переменная $hotels
остается неизменной со всеми 20 записями, вместо этого я должен использоватьновая переменная, т. е. $filtered
, чтобы получить модифицированные результаты от метода filtered()
, но в этом случае я не могу продолжать строить на экземпляре $hotels
, и если скажем, я изменил код конца для поддержки нового$filtered
переменная, если в запросе нет facilities
, мой код просто сломается.
Итак, вот что мне нужно, мне нужно перебрать переменную $hotels
, удалите некоторые элементы, а затем верните это $hotels
в качестве построителя запросов, чтобы продолжать строить его.
Вот что я пробовал :
Я попытался уменьшить метод, он работал почти как filter()
, мне пришлось использовать новую переменную, чтобы получить результаты, но filter()
был лучше.
Допустим, что 'средства '- это последний запрос, который я позвоню перед возвращением. Я попытался переназначить $ hotels на $ отфильтрованный как $hotels = $filtered
, потому что мне больше не понадобится построитель запросов, верно?, но в нижней части кода я разбиваю на страницырезультаты, и это не работает, он сказал мне, что метод paginate()
не существует в коллекции, я думаю.