【问题标题】:Query Condition in Laravel 5Laravel 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;
}

【问题讨论】:

    标签: sql laravel postgresql


    【解决方案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 谢谢!真的行!但是,执行查询需要很长时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2018-12-11
    • 2020-09-19
    • 2015-05-01
    • 2016-11-06
    相关资源
    最近更新 更多