当前位置: 首页 > news >正文

thinkphp6.0版本下子查询sql处理

目录

一:背景

二:查询实例

三:总结


一:背景

我们在实际业务的开发过程中,经常会碰到这样的场景,查询某些部门的客户信息,查询下过订单的客户信息。这里查询客户信息实际上就用到了子查询,通常客户表会有一个字段表示归属员工。通过这个字段可以知道员工的id。同样的员工表会有部门信息,同时订单表也有客户信息。这样我们在客户信息要做到两步。第一步实际上是查询员工id或者客户id的集合,第二步再通过这些集合查询客户表获取客户信息。

二:查询实例

1:比如说我们查询某个部门的客户信息

      $customerList =  Db::name('customer')
            ->when($param['customer_type'] ?? false, function ($query) use ($param) {
                $query->where('user_id', 'in', function ($query) use ($param) {

                    return  $query->name('user')->where('structure_id','in',function($query) use             ($param)   {

                        return $query->name('structure')->when(true,function($query) use ($param) {
                            $query->where('id', '=', $param['dept_id']);
                         

                        })->field('id');

                    })->field('id');

                });

            })
              ->field('id,name,create_time')
             ->limit(100)
            ->select()
            ->toArray();

这里我们构造两个子查询,第一个子查询查询员工信息,第二个子查询查询部门信息,查询部门的时候我们传入部门id作为参数,这样我们这个sql就实现了查询部门id是特定值的客户的信息

这里传入的参数还可以和部门有关的名称或者等级等,这样我们只需要根据入参的不同修改子查询

  return $query->name('structure')->when(true,function($query) use ($param) {
                            $query->where('id', '=', $param['dept_id']);

                        })->field('id');

比如说查询名称:

  return $query->name('structure')->when(true,function($query) use ($param) {
                            $query->where('name', 'like',     '%-'.$param['dept_name']. '-%');

                        })->field('id');

这样也方便我们后期的搜索。

我们还可以根据多个条件查询:

return $query->name('structure')->when(true,function($query) use ($param) {
                            $query->where('id', '=', $param['dept_id']);
                          $query->whereOr('level', 'like', '%-'.$param['dept_level']. '-%');

                        })->field('id');

同时查询满足部门id和等级的条件搜索。

2:查询下过订单的客户信息

        $customerList =  Db::name('customer')
            ->when($param['customer_type'] ?? false, function ($query) use ($param) {
                $query->where('id', 'in', function ($query) use ($param) {

                    return  $query->name('order')->where('status','=',1)->field('uid');

                });

            })
             ->field('id,name,create_time')
             ->limit(100)
            ->select()
            ->toArray();

我们这里查询订单状态是1的客户id集合,再通过id集合获取客户信息。这样查询有个好处就是我们的sql语句会比较短,这样sql执行过程中也不会出现sql语句超过长度。试想下如果我们不使用子查询先根据条件查询到下过订单的客户id集合,然后再通过id集合通过where in的方式查询客户表,如果我们的下单客户数量巨大,那么这个sql语句是很长的。执行会出问题。

三:总结

以上就是thinkphp下子查询的使用,通过子查询,配合多个表的联查和关联搜索还是很方便的。

http://www.lryc.cn/news/362443.html

相关文章:

  • flowable工作流 完成任务代码 及扩展节点审核人(实现多级部门主管 审核等)详解【JAVA+springboot】
  • 【电源专题】一体成型电感为什么需要注意耐压问题
  • 如何看待时间序列与机器学习?
  • vue图标不显示
  • 文件夹如何加密码全攻略,5个文件夹加密方法新手也能学
  • useState和store的区别
  • vscode远程登录阿里云服务器【使用密钥方式--后期无需再进行密码登录】【外包需要密码】
  • 解决uniapp里的onNavigationBarSearchInputClicked不生效
  • Windows下搭建Cmake编译环境进行C/C++文件的编译
  • 实用新型专利申请材料的撰写与准备
  • 代码随想录算法训练营第60天|● 84.柱状图中最大的矩形
  • 让AI给你写代码(9.3):一点改进,支持扩展本地知识库
  • 探索煤化工厂巡检机器人的功能、应用及前景
  • 【活动】GPT-4O:AI语言生成技术的新里程碑
  • 实验笔记之——DPVO(Deep Patch Visual Odometry)
  • 力扣----轮转数组
  • 哥斯拉、冰蝎、中国蚁剑在护网中流量特征分析,收藏起来当资料吧,24年护网用得上
  • 隐藏饼图的legend,重写legend列表。
  • 解决在Mac下使用npm报错:Error: EACCES: permission denied
  • pvt对net delay的影响
  • 力扣5 最长回文子串
  • 【Uniapp小程序】自定义导航栏uni-nav-bar滚动渐变色
  • HarmonyOS鸿蒙学习笔记(25)相对布局 RelativeContainer详细说明
  • 自然语言处理学习中英文翻译语料库
  • 可视化数据科学平台在信贷领域应用系列二:数据清洗
  • JS面试题:hash和history的区别
  • GEE案例——归一化差异水体指数丰水期、枯水期的水域面积和水深分析(青海湖为例)
  • 机器视觉检测--相机
  • 【人工智能】第四部分:ChatGPT的技术实现
  • 小程序配置自定义tabBar及异形tabBar配置操作