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

laravel 5.5 增加宏指令 joinSub, 省去->toSql() 和 addBinding($bindings);

laravel 5.5 增加宏指令 joinSub, 省去->toSql() 和 addBinding($bindings);

1. 在laravel5使用join 子查询时

	$sub_query = DB::table('table1')
            ->select(['table1.id', 'cate_id'])
            ->join('table2', 'table1.id', '=', 'table2.id')
            ->where('table1.cate_id', 2)
            ->orderBy('table1.id');
        DB::table('cate as c')
            ->join(DB::raw("({$sub_query->toSql()}) as t"), 'c.id', '=', 't.cate_id')
            ->addBinding($sub_query->getBindings())
            ->get();

打印sql

select * from cate as c inner join (select table1.id, cate_id from table1 inner join table2 on table1.id = table2.id where table1.cate_id = 2 order by table1.id asc) as t on c.id = t.cate_id;

2. 增加宏指令 joinSub

  Builder::macro('joinSub', function ($subQuery, $alias, $first, $operator = null, $second = null, $type = 'inner', $where = false) {
  	   if ($subQuery instanceof \Illuminate\Database\Eloquent\Builder || $subQuery instanceof Illuminate\Database\Query\Builder) {
           $sql = $subQuery->toSql();
           $bindings = $subQuery->getBindings();
       } elseif (is_string($subQuery)) {
           $sql = $subQuery;
           $bindings = [];
       } else {
           throw new \InvalidArgumentException('Invalid sub-query provided');
       }

       $joinClause = DB::raw("($sql) as $alias");

       return $this->join($joinClause, $first, $operator, $second, $type, $where)
           ->addBinding($bindings);
   });

3. 使用joinSub()

$sub_query = DB::table('table1')
            ->select(['table1.id','cate_id'])
            ->join('table2', 'table1.id', '=', 'table2.id')
            ->where('cate_id', 1)
            ->orderBy('table1.id');
        DB::table('cate as c')
            ->joinSub($sub_query, 't', 'c.id', '=', 't.cate_id')
            ->get();

打印sql

select * from cate as c inner join (select table1.id, cate_id from table1 inner join table2 on table1.id = table2.id where cate_id = 1 order by table1.id asc) as t on c.id = t.cate_id;


http://www.kler.cn/a/411991.html

相关文章:

  • HTTP 管道传输与多路复用
  • Vue.js 中 v-bind 和 v-model 的用法与异同
  • 【微服务】Nacos
  • MySQL INSERT CRTATE DELETE DORP UPDATE WHERE 的用法
  • 代码随想录算法训练营day46|动态规划09
  • Easyexcel(7-自定义样式)
  • [每日一氵] Git LFS 用法
  • 【SQL Server】华中农业大学空间数据库实验报告 实验五 索引
  • 2、Python变量定义及数据类型深度解析
  • 电话机器人如何提高工作效率?
  • 网络知识1-TCP/IP模型
  • 【作业九】RNN-SRN-Seq2Seq
  • 如何提取某站 MV 视频中的音乐为 MP3 音频
  • C# 在Word文档模板中,按照占位符插入文字或图片
  • SQL server 计算同比和环比
  • PHP 类型比较
  • Qt上位机编程命名规范
  • 数字信号处理实验报告六:数字信号处理在多音频拨号系统中的应用
  • SpringBoot3与JUnit5集成测试
  • 100个python经典面试题详解(新版)
  • solr 远程命令执行 (CVE-2019-17558)
  • Cesium教程04_旋转模型
  • 每日刷题之优选算法(滑动窗口)
  • kali安装及使用docker和docker-compose
  • Go语言switch语句
  • 设计理念与数据反馈:面向火星熔岩管探索的跳跃机器人