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

我有一个过滤器查询,它在其中检查三个参数 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.'%','p_status',1)
     ->orWhere('book_id','p_spanish_keywords','p_german_keywords','p_urdu_keywords',1)
     ->paginate(10);

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

YZL9060282 回答:筛选查询无法通过Laravel查询构建器运行

我不确定Poems::where('book_id','=',$filter,'AND','p_english_keywords','LIKE','%'.$query.'%','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,['p_spanish_keywords',['p_german_keywords',['p_urdu_keywords',]);
})
->paginate(10);

但是,由于您始终使用相同的过滤器(book_id = $filterp_status = 1),因此我认为可以进一步减少过滤器:

$poems = Poems::where([
    ['book_id',])
->where(function ($q) use ($query) {
    $q->where('p_english_keywords','%'.$query.'%')
    ->orWhere('p_spanish_keywords','%'.$query.'%')
    ->orWhere('p_german_keywords','%'.$query.'%')
    ->orWhere('p_urdu_keywords','%'.$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 ?
)
本文链接:https://www.f2er.com/3062764.html

大家都在问