Задать вопрос
AlexeewAlex
@AlexeewAlex

Не простые фильтры в Laravel. Есть ли решение?

Привет всем!
Есть сущность - например товар.
Необходимо реализовать ajax фильтр например чтобы фильтровать по критериям например количество, в наличии и так далее.
Это сделать очень просто я делаю так:
$users->where(function ($query) use ($filter) {
    foreach ($filter as $item) {
        $query->orWhereIn($item[0], $item[1]);
    }
});


но когда мне нужно сравнить цены а цены находятся в другой таблице связь один ко многим у меня ничего не получается

делаю так добавляю код снизу
foreach ($filter as $item) {
    if ($item[0] == 'Rates') {
        $users->join('rates', function ($join) use ($item) {
            $join->on('users.id', '=', 'rates.user_id')
                ->where(function ($query) use ($item) {
                    foreach ($item[1] as $rates) {
                        $query->where('rates.time', '=',  '1')
                            ->where('rates.full_rates', '>=', 0)
                            ->where('rates.full_rates', '<=', 150);
                    }
                });
        });
    }
}


этот вариант фильтрует но получается фильтр работает то по цене то по значению
есть ли возможность объединить выборку?
  • Вопрос задан
  • 343 просмотра
Подписаться 3 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
AlexeewAlex
@AlexeewAlex Автор вопроса
Таки разобрался
$usersFiltersOther = $users->where(function ($query) use ($filter) {
                foreach ($filter as $item) {

                    $query->orWhereIn($item[0], $item[1]);

                }
            });

            $selectUsers = null;

            foreach ($filter as $item) {
                if ($item[0] == 'Rates') {
                    $selectUsers = App\User::whereHas('rate', function ($q) use ($item) {
                        $q->where(function ($query) use ($item) {
                            foreach ($item[1] as $rates) {

                                $range = explode(' / ', $rates);


                                $query->orWhere('rates.time', '=', str_replace('s', '', $range[1]))
                                    ->where('rates.incall_rates', '>=', $from)
                                    ->where('rates.incall_rates', '<=', $to);

                            }
                        });

                    })->union($usersFiltersOther)->get();
                }
            }


объединять выборки можно через метод union

также помогла статья https://laravelinfo.com/otladka-zaprosov-v-laravel
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы