Попытка поиска в модели с помощью eloquent - laravel с оптимальными параметрами - PullRequest
1 голос
/ 21 сентября 2019

Я пытаюсь выяснить, почему мой запрос игнорирует все, кроме заголовка и описания.Кнопка поиска, ведущая к контроллеру, предназначена для фильтрации различных типов объявлений, по категориям, по регионам, по цене.Например, если теперь я ищу существующее объявление, и оно будет найдено по названию / ключевому слову -> всегда будет отображаться, даже если я выберу другой регион / категорию / диапазон цен

Я пытаюсь использовать что-то, что спасет менямного операторов if, чтобы проверить, существуют ли они в запросе.Может быть, другой вариант si использовать https://github.com/mohammad-fouladgar/eloquent-builder для построения моего запроса

 public function index(Request $request)
    {
        $keyword = $request['keyword'];
        $category_id = $request['category_id'];
        $type_id = $request['type_id'];
        $region_id = $request['region_id'];
        $min_price = $request['min_price'];
        $max_price = $request['max_price'];


        $result = Ad::when($keyword, function ($q) use ($keyword) {
            return $q->where('title', 'like', '%' . $keyword . '%')->orWhere('description', 'like', '%' . $keyword . '%');
        })
            ->when($category_id, function ($q) use ($category_id) {
                return $q->where('category_id', $category_id);
            })
            ->when($region_id, function ($q) use ($region_id) {
                return $q->where('region_id', '=', $region_id);
            })
            ->when($type_id, function ($q) use ($type_id) {
                return $q->where('adtype_id', '=', $type_id);
            })
            ->when($min_price, function ($q) use ($min_price) {
                return $q->where('price', '>=', $min_price);
            })
            ->when($max_price, function ($q) use ($max_price) {
                return $q->where('price', '<=', $max_price);
            })
            ->paginate(8);

Мой URL-адрес get get выглядит так: search? Keyword = & category_id = 0®ion_id = 0 & type_id = 0 & min_price = & max_price =

Произведенный запрос в mysql, когда я ищу существующее объявление по его имени и ищу другую категорию:

select * from `ads` where `title` like '%test test%' or `description` like '%test test%' and `category_id` = '2' limit 8 offset 0

Объявление найдено, но фактическая категория - 1, а не2, то же самое для всех других оптимальных параметров.

1 Ответ

0 голосов
/ 21 сентября 2019

Вы можете отредактировать ваш запрос для поиска конкретных отношений, используя whereHas.Этот метод позволит вам добавить настраиваемые ограничения в ограничение отношений, например, проверить содержимое комментария. А для проверки максимальной / минимальной цены используйте метод where.Итак, вы можете использовать его так:

$result = Ad::when($keyword, function ($q) use ($keyword) {
            return $q->where('title', 'like', '%' . $keyword . '%')->orWhere('description', 'like', '%' . $keyword . '%');
        })
            ->whereHas('category_relation_name', function ($q) use ($category_id) {
                return $q->where('category_id', $category_id);
            })
            ->whereHas('region_relation_name', function ($q) use ($region_id) {
                return $q->where('region_id', $region_id);
            })
            ->whereHas('type_relation_name', function ($q) use ($type_id) {
                return $q->where('adtype_id', $type_id);
            })
            ->where('price', '>=', $min_price);
            ->where('price', '<=', $max_price);
            ->paginate(8);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...