TP5 + MySQL多条件复合查询

先放一张数据库表结构:

这个需求也是比较恶心和奇葩的…
这个表是其他四个表的缝合怪…(维修费表,油料费表,停车费表,ETC费表)
只有一个车牌号的字段是共有字段, type这个字段是我自己加的,作用就是区分四张表的数据,其他字段就都原封不动的复制过来了.
框架用的FastAdmin, 不是很熟悉..改起来也没那么顺手

需求原话:
“异常的话一是维修费根据维修单号进行判定,重复的为异常,二是停车费,ETC等费用以车辆总表内的车牌号进行配比,无车牌的属于异常,便于查明情况”
要做一个异常数据报警的列表.

简单来说就是分为两种情况:
1. type字段等于0(即维修费异常报警), 并且维修单号字段有重复值的, 就是我们需要查出来的数据
2. type字段等于2 或 3(即停车费或ETC异常报警), 并且车牌号字段值为空的, 就是我们需要查出来的数据

这两种查询条件组合一下就是最终需要的数据.

需求结束.

由于FastAdmin自动生成的CRUD里带有前端数据表API, 所以需要在控制器里重写一下这个index方法.
贴下代码:

/**
 * 查看
 */
public function index()
{
    //设置过滤方法
    $this->request->filter(['strip_tags', 'trim']);
    if ($this->request->isAjax()) {
        //如果发送的来源是Selectpage,则转发到Selectpage
        if ($this->request->request('keyField')) {
            return $this->selectpage();
        }
        list($where, $sort, $order, $offset, $limit) = $this->buildparams();

        # 需求:
        # 异常的话一是维修费根据维修单号进行判定,重复的为异常,
        # 二是停车费,ETC等费用以车辆总表内的车牌号进行配比,无车牌的属于异常,便于查明情况

        // 查出维修费的所有单号
        $order_list = Db::name('cost_control')
            ->where('type', 0)
            ->column('repair_order_number');
        // 去重操作
        $unique_arr = array_unique($order_list);
        // 得到完整数据和去重后数组的差值, 即重复单号
        $repeat_arr = array_diff_assoc($order_list, $unique_arr);
        // 逗号分割成字符串
        $repeat_str = implode(',', $repeat_arr);

        // 定义查询条件
        // 1.类型type=0即维修费, 如有单号相同的即为异常报警
        $myWhere = [];
        $myWhere['type'] = 0;
        $myWhere['repair_order_number'] = ['in', $repeat_str];
        // 2.类型type=2或3的,即=停车费或ETC费, 车牌字段为空的即为异常报警
        $myWhereor = [];
        $myWhereor['type'] = [['eq', 2], ['eq', 3], 'or'];
        $myWhereor['plate_no'] = [['eq', null], ['eq', ''], 'or'];


        $list = $this->model
            ->where($where)
            ->where(function ($query) use ($myWhere){
                $query->where($myWhere);
            })->whereOr(function ($query) use ($myWhereor){
                $query->where($myWhereor);
            })->order($sort, $order)
            ->paginate($limit);

        $result = array("total" => $list->total(), "rows" => $list->items());

        return json($result);
    }
    return $this->view->fetch();
}

再贴一下原生sql语句:

SELECT * FROM `fa_cost_control` WHERE  (  `type` = '0'  AND `repair_order_number` IN ('20200925090653') ) OR (  ( `type` = '2' or `type` = '3' )  AND ( `plate_no` = null or `plate_no` = '' ) )

风影OvO

风影OvO, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA 4.0协议进行授权 | 转载请注明原文链接

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐