为什么我的Laravel不以查询工作为条件?

时间:2019-12-23 16:30:06

标签: laravel eloquent

我正在尝试创建条件User搜索功能。用户可以选择三个过滤器进行搜索:

  • 用户名
  • 与用户关联的公司名称
  • 与用户关联的角色名称

在下面的示例中,为简单起见,我将所有过滤器都放置在数组$searchFilters中。

我只希望Laravel搜索数组中存在的过滤器。

代码

$q = request()->q;
$searchWildcard = '%' . $q . '%';
$searchFilters = ['name', 'roles', 'company'];

$users = User::when(in_array('roles', $searchFilters), function ($query) use ($searchWildcard) {
      $query->whereHas('roles', function($query) use ($searchWildcard) {
         $query->where('name', 'LIKE', $searchWildcard);
      });
   })->when(in_array('company', $searchFilters), function($query) use ($searchWildcard) {
      $query->whereHas('company', function($query) use ($searchWildcard) {
         $query->orWhere('name', 'LIKE', $searchWildcard);
       });
   })->when(in_array('name', $searchFilters), function($query) use ($searchWildcard) {
      $query->orWhere('name', 'LIKE', $searchWildcard);
}); 

查询的第一部分有效:它根据用户的搜索查询来检索角色,但不适用于公司名称或用户名。

修改

它仅对公司名称无效。

1 个答案:

答案 0 :(得分:2)

您的orWhere条件在另一个where内部,所以我想它不会按预期工作。

我建议将您的whereHas更改为orWhereHas,然后将其中的orWhere更改为where

$users = User::when(in_array('roles', $searchFilters), function ($query) use ($searchWildcard) {
    $query->whereHas('roles', function ($query) use ($searchWildcard) {
        $query->where('name', 'LIKE', $searchWildcard);
    });
})->when(in_array('company', $searchFilters), function ($query) use ($searchWildcard) {
    $query->orWhereHas('company', function ($query) use ($searchWildcard) {
        $query->where('name', 'LIKE', $searchWildcard);
    });
})->when(in_array('name', $searchFilters), function ($query) use ($searchWildcard) {
    $query->orWhere('name', 'LIKE', $searchWildcard);
});