我有一个过滤器查询,它在其中检查三个参数 id ,关键字和状态。当我在MySQL中运行此查询时,它的运行情况很好,但是当我尝试通过Laravel的查询生成器运行它时,它将获取该 id 的所有结果。
这是我正在MySQL中运行的查询(并且像我提到的那样工作正常):
SELECT * FROM `poems`
WHERE book_id = 2
AND p_english_keywords LIKE '%freedom%'
AND p_status = 1
这是Laravel的查询生成器代码:
$poems = Poems
::where('book_id', '=', $filter, 'AND', 'p_english_keywords', 'LIKE', '%'.$query.'%', 'AND', 'p_status', '=', 1)
->orWhere('book_id', '=', $filter, 'AND', 'p_spanish_keywords', 'LIKE', '%'.$query.'%', 'AND', 'p_status', '=', 1)
->orWhere('book_id', '=', $filter, 'AND', 'p_german_keywords', 'LIKE', '%'.$query.'%', 'AND', 'p_status', '=', 1)
->orWhere('book_id', '=', $filter, 'AND', 'p_urdu_keywords', 'LIKE', '%'.$query.'%', 'AND', 'p_status', '=', 1)
->paginate(10);
此查询看起来很好,而且如果用户删除过滤器,它也可以正常工作。它以用户的语言搜索关键字。但是,只要用户应用过滤器,它就会显示过滤后的书的所有结果,而不是该书中的特定关键字。请帮忙!
答案 0 :(得分:2)
我不确定Poems::where('book_id', '=', $filter, 'AND', 'p_english_keywords', 'LIKE', '%'.$query.'%', 'AND', 'p_status', '=', 1)
为何对您有用,因为该语法不在documentation中,因此我要重写您的查询。
$poems = Poems::where(function ($q) use ($filter, $query) {
$q->where([
['book_id', '=', $filter],
['p_english_keywords', 'like', '%'.$query.'%'],
['p_status', '=', 1],
]);
})
->orWhere(function ($q) use ($filter, $query) {
$q->where([
['book_id', '=', $filter],
['p_spanish_keywords', 'like', '%'.$query.'%'],
['p_status', '=', 1],
]);
})
->orWhere(function ($q) use ($filter, $query) {
$q->where([
['book_id', '=', $filter],
['p_german_keywords', 'like', '%'.$query.'%'],
['p_status', '=', 1],
]);
})
->orWhere(function ($q) use ($filter, $query) {
$q->where([
['book_id', '=', $filter],
['p_urdu_keywords', 'like', '%'.$query.'%'],
['p_status', '=', 1],
]);
})
->paginate(10);
但是,由于您始终使用相同的过滤器(book_id = $filter
和p_status = 1
),因此我认为可以进一步减少过滤器:
$poems = Poems::where([
['book_id', '=', $filter],
['p_status', '=', 1],
])
->where(function ($q) use ($query) {
$q->where('p_english_keywords', 'like', '%'.$query.'%')
->orWhere('p_spanish_keywords', 'like', '%'.$query.'%')
->orWhere('p_german_keywords', 'like', '%'.$query.'%')
->orWhere('p_urdu_keywords', 'like', '%'.$query.'%');
})
->paginate(10);
使用toSql()
,我得到以下查询,我认为您正在寻找:
select * from `poems`
where (
`book_id` = ? and `p_status` = ?
)
and (
`p_english_keywords` like ?
or `p_spanish_keywords` like ?
or `p_german_keywords` like ?
or `p_urdu_keywords` like ?
)