筛选查询无法通过Laravel查询构建器运行

时间:2019-11-20 20:08:47

标签: php mysql laravel query-builder laravel-query-builder

我有一个过滤器查询,它在其中检查三个参数 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);

此查询看起来很好,而且如果用户删除过滤器,它也可以正常工作。它以用户的语言搜索关键字。但是,只要用户应用过滤器,它就会显示过滤后的书的所有结果,而不是该书中的特定关键字。请帮忙!

1 个答案:

答案 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 = $filterp_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 ?
)