Перебор экземпляра построителя запросов, удаление некоторых элементов и возвращение измененного экземпляра - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть этот запрос, который я создаю для серверной функции поиска / фильтрации, у меня есть экземпляр построителя запросов, который изменяется каждый раз, когда пользователь проверяет новый фильтр, все шло хорошо, пока у меня не было фильтра, который проверяетдля отношений 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() не существует в коллекции, я думаю.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я думаю, что вы должны использовать ниже, когда (эффективный способ) условные предложения

Чек https://laravel.com/docs/5.7/queries#conditional-clauses

Пример

$users = DB::table('users')
                ->when(request()->category_id, function ($query, request()->category_id) {
                    return $query->where('category_id', request()->category_id);
                })->get();
0 голосов
/ 06 декабря 2018

как то так

if(request()->has('facility_id')) {
    $hotels->whereHas('facilities', function ($query) {
        return $query->whereIn('facility_id', [4])->where('facility_id', '<>', '');
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...