Laravel中具有多个条件的搜索功能

时间:2019-04-02 05:46:12

标签: laravel eloquent laravel-5.7

-->

我试图根据4个请求进行搜索; categorieslocationkeywordsorting。具有3个请求(locationcategoriessorting)的搜索功能效果很好,并且输出正确。

但是问题是,当我的网站发送带有keywords数据的请求时,当我尝试发送keywords / {时,输出结果仅是来自location请求的结果{1}}请求,输出不会改变(仅关键字请求的输出)

JSON Response

这是我写的代码:

categories

2 个答案:

答案 0 :(得分:1)

代码的主要问题是您的locationscategories搜索查询没有再次设置$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();
}

在这里,我们遍历categorieslocations请求数据,并查看数据是否为->filled()(已定义且不为空)。如果是这样,我们将运行查询。

答案 1 :(得分:0)

尝试一下

 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();
  }
相关问题
最新问题