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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值