【发布时间】:2019-08-16 07:57:36
【问题描述】:
我正在尝试根据他们发布内容的类别以及搜索字符串直接过滤用户:
$users = User::when($search, function ($query) use ($request) {
$query->where('name', 'like', '%' . $request['search'] . '%')
->orWhere('email', 'like', '%' . $request['search'] . '%');
return $query;
})
->when($categories, function ($query) use ($request) {
return $query->whereHas('posts.category', function ($query) use ($request) {
$query->whereIn('name', $request['categories']);
});
})
->select('id', 'name', 'email')
->paginate(10);
当我只过滤类别(没有$search)时,它按预期工作,但只要我输入搜索字符串,结果就会被搜索字符串$request['search'] 过滤,但完全忽略类别过滤。
例如:
名为“Jon”的用户在“生活方式”类别中有一个帖子。
另一个名为“Jonn”的用户在“体育”类别中有一个帖子。
现在,如果我只过滤“体育”类别,我会得到正确的结果 ->“乔恩”。
但是,如果我另外使用搜索字符串“Jon”进行过滤,结果是 ->“Jon”和“Jonn”,这不是预期的结果,因为它应该再次过滤“Sports”并命名为“%Jon%”结果应该只是“乔恩”。
我不知道如何实现where() 和whereHas() 的过滤器组合。
【问题讨论】:
-
开始尝试
echo $query_builder->toSql();以查看您的最终 SQL 语句。