美文网首页
laravel 实现多个查询语句union并对查询结果做分页

laravel 实现多个查询语句union并对查询结果做分页

作者: 左诗右码 | 来源:发表于2018-12-24 15:03 被阅读0次

直接先贴出 sql 查询语句如下

SELECT
    `assets_device`.* 
FROM
    (
        (
        SELECT
            `id`,
            `sub_category_id`,
            `number`,
            `name`,
            `location`,
            `officeBuilding`,
            `area`,
            `department`,
            `rack`,
            `rack_pos` 
        FROM
            `assets_device` 
        WHERE
            `department` IN ( 6, 7, 17, 20 ) 
            AND `assets_device`.`deleted_at` IS NULL 
        ) UNION
        (
        SELECT
            `id`,
            `sub_category_id`,
            `number`,
            `name`,
            `location`,
            `officeBuilding`,
            `area`,
            `department`,
            `rack`,
            `rack_pos` 
        FROM
            `assets_device` 
        WHERE
            `area` IN ( 13, 14 ) 
            AND `assets_device`.`deleted_at` IS NULL 
        ) 
    ) AS assets_device

实现代码如下所示

    public function getChoiceAssetsByErOrDt($request){

        $input = $request->input();

        // 机房 id 数组
        if(isset($input['er'])){
            if(is_array($input['er'])){
                $erIds = $input['er'];
            }else{
                $erIds = explode(',',$input['er']);
            }
        }else{
            $erIds = array();
        }

        // 科室 id 数组
        if(isset($input['dt'])){
            if(is_array($input['dt'])){
                $dtIds = $input['dt'];
            }else{
                $dtIds = explode(',',$input['dt']);
            }
        }else{
            $dtIds = array();
        }

        // id, 子分类id, 资产编号, 资产名称, 位置, 办公楼, 机房, 科室, 机柜, 机柜U数
        $field = ['id','sub_category_id','number','name','location','officeBuilding','area','department','rack','rack_pos'];
        
        if($erIds){
            // 根据机房 id 查询资产
            $erModel = $this->deviceModel->select($field)
                ->whereIn('area',$erIds);
        }

        if($dtIds){
            // 根据科室 id 查询资产
            $dtModel = $this->deviceModel->select($field)
                ->whereIn('department',$dtIds);
        }

        $model = $dtModel->union($erModel);

// 注意合并参数时 $subQuery 必须是 \Illuminate\Database\Query\Builder 类型
// 如果是 \Illuminate\Database\Eloquent\Builder 类型的,用 getQuery() 方法
        $data = $this->deviceModel->with('sub_category','zone','office_building','engineroom','department')
                                    ->mergeBindings($model->getQuery())
                                    ->select(["assets_device.*"])
                                    ->from(DB::raw("({$model->toSql()}) as assets_device"))
                                    ->withTrashed()
                                    ->orderBy('assets_device.id')
                                    ->paginate()
                                    ->toArray();
        
        // 以下代码如果使用 transformer 的话,就不需要写,直接可以在 transformer 里面转换
        foreach ($data['data'] as &$val){
            $val['department_name'] = isset($val['department']['name']) ? $val['department']['name'] : '';
            $val['sub_category_name'] = isset($val['sub_category']['name']) ? $val['sub_category']['name'] : '';
            $val['zone_name'] = isset($val['zone']['name']) ? $val['zone']['name'] : '';
            $val['office_building_name'] = isset($val['office_building']['name']) ? $val['office_building']['name'] : '';

            if(isset($val['engineroom']['name'])){
                $erdt = $val['engineroom']['name'];
            }elseif (isset($val['department']['name'])){
                $erdt = $val['department']['name'];
            }else{
                $erdt = null;
            }
            $val['erdt'] = $erdt;
            unset($val['department']);
            unset($val['sub_category']);
            unset($val['zone']);
            unset($val['office_building']);
            unset($val['engineroom']);
            unset($val['department']);
        }

        return $data;

    }

相关文章

  • laravel 实现多个查询语句union并对查询结果做分页

    直接先贴出 sql 查询语句如下 实现代码如下所示

  • hyperf 使用模型写 union 子查询并做分页

    hyperf 使用模型写 union 子查询并做分页 最终需要实现的 sql 语句为如下所示: hyperf 代码为

  • 读书笔记《MySQL必知必会》之第十七章组合查询

    什么是组合查询 把多个select语句的结果作为单个查询的结果集返回,就称为并(union)或复合查询(compo...

  • union联合查询

    含义 将多条查询语句的结果合并成一个结果 语法: 查询语句1 union 查询语句2 union ... 应用场景...

  • 联合查询

    将多条查询语句的结果合并成一个结果语法:查询语句1union查询语句2union... 引入案例:查询部门编号>9...

  • mysql联合查询

    进阶9:联合查询 /*union 联合 合并:将多条查询语句的结果合并成一个结果 语法:查询语句1union查询语...

  • 接口文档定义

    1.品牌列表分页+条件实现查询 根据用户输入的品牌名称或首字母查询品牌信息,并对查询结果做分页处理。 请求地址: ...

  • Laravel UNION联合查询并分页

    UNION联合查询并分页 联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全...

  • 联合查询

    一、含义 union:合并、联合,将多次查询结果合并成一个结果 二、语法 查询语句1union 【all】查询语句...

  • 11. 组合查询

    组合查询 SQL 允许执行多个查询,并将结果作为一个查询结果集返回,这些组合查询通常称为并(union)或复合查询...

网友评论

      本文标题:laravel 实现多个查询语句union并对查询结果做分页

      本文链接:https://www.haomeiwen.com/subject/zdlzkqtx.html