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 關注
- 352 瀏覽
添加回答
舉報