Функция поиска с несколькими условиями в Laravel - PullRequest
0 голосов
/ 02 апреля 2019

Я попытался сделать функцию поиска на основе 4 запросов; categories, location, keyword и sorting. Функция поиска с 3 запросами (location, categories и sorting) работает хорошо и имеет правильный вывод.

Но проблема в том, что, когда мой веб-сайт отправил запрос с данными keywords, результаты вывода являются только результатом только запроса keywords, когда я пытаюсь отправить запросы location / categories, выходные данные не изменяется (только вывод запроса ключевого слова)

JSON Response

Вот код, который я пишу:

    public function getBy(Request $request) {
        $categories = $request->all()['categories'];
        $location   = $request->all()['location'];
        $sorting    = $request->all()['sorting'];
        $keyword    = $request->all()['keyword'];

        //--- sorting code ---

        //keyword request
        if ($keyword === null) {
          $jobs = Job::query();
        } else {
          $jobs = Job::query()->where('job_title', 'LIKE', "%{$keyword}%")
            ->orWhere('title', 'LIKE', "%{$keyword}%")
            ->orWhere('description', 'LIKE', "%{$keyword}%")
            ->orWhereHas('users', function ($q) use ($keyword) {
              $q->where('company_name', 'LIKE', "%{$keyword}%");
            })->orWhereHas('categories', function ($q) use ($keyword) {
              $q->where('category', 'LIKE', "%{$keyword}%");
            })->orWhereJsonContains('tags', $keyword);
        }

        //location and categories request
        if ($location === [] && $categories === []) {
          $jobs;
        } elseif ($location === []) {
          $jobs->whereHas('categories', function ($q) use ($categories) {
            $q->whereIn('slugs', $categories);
          });
        } elseif ($categories === []) {
          $jobs->whereHas('location', function ($q) use ($location) {
            $q->whereIn('city_name', $location);
          });
        } else {
          $jobs->whereHas('categories', function ($q) use ($categories) {
            $q->whereIn('slugs', $categories);
          })->whereHas('location', function ($q) use ($location) {
            $q->whereIn('city_name', $location);
          });
        }

        //return as JSON
      }

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Основная проблема с вашим кодом - ваши locations и categories поисковые запросы не устанавливали $jobs снова. Это должно выглядеть так:

 $jobs = $jobs->whereHas('categories', function ($q) use ($categories) {
     $q->whereIn('slugs', $categories);
 });

Это установит переменную $jobs для включения новых условий запроса.

Я бы также предложил не проверять, являются ли $locations или $categories пустыми, так как они, если операторы для каждого уже имеют дело с условием. Вот некоторый переработанный код:

public function getBy(Request $request) {
    $sorting    = $request->all()['sorting'];

    //--- sorting code ---

    //keyword request
    if (! $keywords = request('keywords')) {
        $jobs = Job::query();
    } else {
        $jobs = Job::query()->where('job_title', 'LIKE', "%{$keyword}%")
            ->orWhere('title', 'LIKE', "%{$keyword}%")
            ->orWhere('description', 'LIKE', "%{$keyword}%")
            ->orWhereHas('users', function ($q) use ($keyword) {
                $q->where('company_name', 'LIKE', "%{$keyword}%");
            })->orWhereHas('categories', function ($q) use ($keyword) {
                $q->where('category', 'LIKE', "%{$keyword}%");
            })->orWhereJsonContains('tags', $keyword);
    }

    foreach (['categories', 'locations'] as $field) {
        if ($request->filled($field)) {
            $jobs = $jobs->whereHas($field, function ($q) use ($field) {
                $q->whereIn('slugs', request($field));
            });
        }
    }

    return $jobs->get()->toArray();
}

Здесь мы перебираем данные запроса categories и locations и видим, являются ли данные ->filled() (определены и не пусты). Если это так, мы запускаем запрос.

0 голосов
/ 02 апреля 2019

Попробуйте это

 public function getBy(Request $request) {
    $categories = $request->categories;
    $location   = $request->location;
    $sorting    = $request->sorting;
    $keyword    = $request->keyword;

    //--- sorting code ---


    $jobs = Job::query();

    //keyword request
    if ($keyword !== null) {
      $jobs = $jobs->where('job_title', 'LIKE', "%{$keyword}%")
        ->orWhere('title', 'LIKE', "%{$keyword}%")
        ->orWhere('description', 'LIKE', "%{$keyword}%")
        ->orWhereHas('users', function ($q) use ($keyword) {
          $q->where('company_name', 'LIKE', "%{$keyword}%");
        })->orWhereHas('categories', function ($q) use ($keyword) {
          $q->where('category', 'LIKE', "%{$keyword}%");
        })->orWhereJsonContains('tags', $keyword);
    }

    //location and categories request
    if ($location === []) {
      $jobs = $jobs->whereHas('categories', function ($q) use ($categories) {
        $q->whereIn('slugs', $categories);
      });
    } elseif ($categories === []) {
      $jobs = $jobs->whereHas('location', function ($q) use ($location) {
        $q->whereIn('city_name', $location);
      });
    } else {
      $jobs = $jobs->whereHas('categories', function ($q) use ($categories) {
        $q->whereIn('slugs', $categories);
      })->whereHas('location', function ($q) use ($location) {
        $q->whereIn('city_name', $location);
      });
    }

    return $jobs->get();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...