2 回答
TA贡献1804条经验 获得超2个赞
你可以这样试试:
$users = User::where(function ($query) {
$query->when($search, function ($query) use ($request) {
$query->where('name', 'like', '%' . $request['search'] . '%')
->orWhere('address', 'like', '%' . $request['search'] . '%')
->orWhere('email', 'like', '%' . $request['search'] . '%');
})
$query->when($categories, function ($query) use ($request) {
$query->whereHas('posts.category', function ($query) use ($request) {
$query->whereIn('name', $request['categories']);
});
})
})
->select('id', 'name', 'email')
->paginate(10);
我认为你不需要你的回报。但是,如果您将when语句放在这样的一个where函数中,您就可以实现您想要的。
我没有测试这个解决方案,所以如果你有错误,请在评论中提供它。
TA贡献1812条经验 获得超5个赞
您的问题是约束的嵌套。转换为 SQL,您的查询如下所示:
SELECT id, name, email
FROM users
WHERE name like '%foo%'
OR address like '%foo%'
OR email like '%foo%'
AND EXISTS (
SELECT *
FROM categories c
INNER JOIN posts p ON p.category_id = c.id
WHERE c.name IN ('bar', 'baz')
)
注意:分页省略
如您所见,目前还不清楚这些WHERE语句应该做什么。但这可以通过将所有搜索约束包装在一个额外的内容中来轻松解决where():
$users = User::when($search, function ($query) use ($request) {
$query->where(function $query) use ($request) {
$query->where('name', 'like', '%' . $request['search'] . '%')
->orWhere('address', 'like', '%' . $request['search'] . '%')
->orWhere('email', 'like', '%' . $request['search'] . '%');
});
})
->when($categories, function ($query) use ($request) {
$query->whereHas('posts.category', function ($query) use ($request) {
$query->whereIn('name', $request['categories']);
});
})
->select('id', 'name', 'email')
->paginate(10);
这样您的查询将如下所示:
SELECT id, name, email
FROM users
WHERE
(
name like '%foo%'
OR address like '%foo%'
OR email like '%foo%'
)
AND EXISTS (
SELECT *
FROM categories c
INNER JOIN posts p ON p.category_id = c.id
WHERE c.name IN ('bar', 'baz')
)
旁边的一个小说明:您不必$query从回调中返回。
- 2 回答
- 0 关注
- 319 浏览
添加回答
举报