为什么';我的Laravel条件哪里有查询工作?

为什么';我的Laravel条件哪里有查询工作?,laravel,eloquent,Laravel,Eloquent,我正在尝试创建一个有条件的用户搜索函数。用户可以选择三个过滤器进行搜索: 用户名 与用户关联的公司名称 与用户关联的角色名称 在下面的示例中,为了简单起见,我将所有过滤器放在数组$searchFilters中 我只希望Laravel搜索数组中存在的过滤器 代码 $q = request()->q; $searchWildcard = '%' . $q . '%'; $searchFilters = ['name', 'roles', 'company']; $users = 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);
}); 
查询的第一部分起作用:它根据用户的搜索查询检索角色,但不适用于公司名称或用户名

编辑


它只对公司名称不起作用。

或where
条件在另一个
where
中,因此我认为它不会像预期的那样起作用

我建议将您的
where has
更改为
或where has
,然后将其中的
或where
更改为
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);
});

或where
条件在另一个
where
中,因此我认为它不会按预期工作

我建议将您的
where has
更改为
或where has
,然后将其中的
或where
更改为
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);
});

@很高兴我能帮忙@很高兴我能帮忙!