Laravel 5 中的查询条件

Posted

技术标签:

【中文标题】Laravel 5 中的查询条件【英文标题】:Query Condition in Laravel 5 【发布时间】:2021-12-21 21:11:19 【问题描述】:

我想根据查询结果显示每个省份的数据条目数。

这是我使用的查询。但是用这样的代码,我得到的输出只是每个省份包含条件['t_entry.etitle', 'ilike', $title]的数据个数。

同时,条件['t_entry.edesc','ilike',$title] 没有被执行。所以我得到的数据量很小。如何处理?

    public function getTotalEntryByTitle($title)
    $total = [];

    $province = t_data_enum::where('ekey', 'province')->orderBy('etext', 'ASC')->get();
    foreach($province as $a)
        $entrys = t_e_elem::selectRaw('t_entry.*,t_e_elem.*')
            ->join('t_entry', 't_e_elem.eid', '=', 't_entry.eid')
            ->join('t_e_value', 't_e_elem.fid', '=', 't_e_value.elid')
            ->join('t_entry_form', 't_e_value.fid', '=', 't_entry_form.fid')
            ->where([['t_e_elem.fuse', '=', 1], ['t_entry.etitle', 'ilike', $title], ['t_entry.edesc','ilike',$title]]);
        $entrys = $entrys->where('t_entry.estatus', '1');

        $formIdP = t_entry_form::where([['etype', 1], ['fname', 'field_province']])->first()->fid;
        $entrys = $entrys->where([['t_e_value.fid', '=', $formIdP], ['t_e_value.vvalue', '=', $a->eval],
            ['t_e_elem.fuse', '=', 1]]);

        $entrys = $entrys->distinct("t_entry.eid")
            ->where([['t_entry.etitle','ilike',$title], ['t_entry.edesc','ilike',$title]])
            ->get();

        array_push($total, [
            'name' => $a->etext,
            'count' => count($entrys)
        ]);
    

    return $total;

【问题讨论】:

【参考方案1】:

我将解释查询构建器如何在您的情况下构建查询:

以该语句为例:

$entrys = t_e_elem::where([['t_e_elem.fuse', '=', 1], ['t_entry.etitle', 'ilike', $title], ['t_entry.edesc','ilike',$title]]);

这将生成 sql:

select * from `t_e_elems` where (`t_e_elem`.`fuse` = ? and `t_entry`.`etitle` ilike ? and `t_entry`.`edesc` ilike ?)

注意and,这就是问题所在,你不希望and 通常在你需要or 的搜索中,所以sql 语句应该是:

select * from `users` where `t_e_elem`.`fuse` = ? and (`t_entry`.`etitle` ilike ? or `t_entry`.`edesc` ilike ?)

Laravel 查询构建器是:

 t_e_elem::where('t_e_elem.fuse', '=', 1)
            ->where(function ($query) use ($title) 
                $query->where('t_entry.etitle', 'ilike', $title)
                    ->orwhere( 't_entry.edesc','ilike',$title);
            )

最终结果如下:

 $entrys = t_e_elem::selectRaw('t_entry.*,t_e_elem.*')
                ->join('t_entry', 't_e_elem.eid', '=', 't_entry.eid')
                ->join('t_e_value', 't_e_elem.fid', '=', 't_e_value.elid')
                ->join('t_entry_form', 't_e_value.fid', '=', 't_entry_form.fid')
                ->where('t_e_elem.fuse', '=', 1)
                ->where(function ($query) use ($title) 
                    $query->where('t_entry.etitle', 'ilike', $title)->orWhere('t_entry.edesc', 'ilike', $title);
                );
            $entrys = $entrys->where('t_entry.estatus', '1');

            $formIdP = t_entry_form::where([['etype', 1], ['fname', 'field_province']])->first()->fid;
            $entrys = $entrys->where([['t_e_value.fid', '=', $formIdP], ['t_e_value.vvalue', '=', $a->eval],
                ['t_e_elem.fuse', '=', 1]]);

            $entrys = $entrys->distinct("t_entry.eid")
                ->where(function($query) use ($title) 
                $query->where('t_entry.etitle','ilike', $title)->orWhere('t_entry.edesc', 'ilike', $title);)
                ->get();

【讨论】:

谢谢.. 但是,对不起,你能写下我必须写的完整代码吗?我还是一头雾水。 很好的答案,谢谢 @niasanny。请将此答案标记为已接受,以便我们将此问题视为“已解决” @OMR 谢谢!真的行!但是,执行查询需要很长时间。

以上是关于Laravel 5 中的查询条件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8 有条件地插入 sql 片段

Laravel concat 查询(where 条件)

Laravel 雄辩的查询与条件下另一个表中的值的总和

如何在 Laravel 的 DB 查询中编写两个 where 条件?

Laravel 5.4 路由器中的条件设置控制器

如何在 Laravel 中的 SELECT 语句后插入记录时应用“ON CONFLICT”条件?