我正在尝试创建条件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);
});
查询的第一部分有效:它根据用户的搜索查询来检索角色,但不适用于公司名称或用户名。
修改
它仅对公司名称无效。
答案 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);
});