laravel联表查询数据的一些常用方法

//多对一
        //join 数据在同一级,强关系
        $a=Order::select('users.aid','users.merchant_no','orders.*')

                        ->join('users',function($join){
                                   $join->on('users.id','=','orders.user_id')->where('users.id','=',800129);
                        })

                        ->orderby('orders.id','desc')

                        ->paginate(20);

        //with 数据不在同一级,弱关系
       $b = Order::with(['user'=>function($query){
                          $query->select('id','merchant_no')

                          ->where('id','=',800129);
                          }])

                          ->orderby('id','desc')

                          ->paginate();

        //强关系,但是没有数据, 可以加上with 附加用户数据

          (如果join的表中没有user表对应的数据,则仍然会查询到user的内容)
                   $c=Order::whereHas('user', function ($query) {
                                        $query->where('id', '=' ,'800129');
                                     })

                                      ->orderby('id','desc')

                                      ->with('user')

                                      ->paginate();

        dd($a->toArray());
        dd($b->toArray());
        dd($c->toArray());

 

 

可能有人会看不懂,这边举一个例子:要获取这个商户旗下所有门店还有门店的收益包含笔数

商户和门店数据放在user表,关联的是user表的aid = user表的id 表示是这个id的门店

接下来看下面两个查询,这是有区别的

   查询一:这是user先筛选门店,然后aid=当前商户id的时候进行连接(leftjoin)订单表,订单表的user_id等于user表的id 

下一步查询所有相关订单的金额合计sum(orders.trade_amount)还有交易的订单的笔数count(orders.trade_amount),还有门店的名字body,查询按照user_id和body进行分组,最后筛选订单状态pay_status必须是已支付(2)才查询出来

这边查询是成功的!但是会出现一个问题,如果我旗下的门店没有进行订单的交易,那么这个查询就无法查到旗下这家门店,因为join连接,必须是两个表共有东西才能出来,所以此查询表现出弱关系(上述说到!)

                  $data = User::store()
                ->where('aid','=',$params['id'])
                ->leftjoin('orders','users.id','=','orders.user_id')
                ->select(DB::raw('sum(orders.trade_amount) as money, count(orders.trade_amount)as number,body'))
                ->groupBy('user_id','body')
                ->where('orders.pay_status','=','2')
                ->get();

        

查询二:同样user先筛选门店,然后aid=当前商户id的时候进行连接(with)订单表,订单表的user_id等于user表的id 

下一步查询所有相关订单user_id和相关订单的金额合计sum(orders.trade_amount)还有交易的订单的笔数count(orders.trade_amount),还有门店的名字body,筛选订单状态pay_status必须是已支付(2)才查询出来,最后查询按照user_id进行分组,

这边查询是成功的!并且不会出现像查询一那样 ,而是会进行这样的查询:order表和user表没有相关的数据,仍然会显示数据,不管这家门店是否有订单,都会查询到有这家门店的存在,这是上述讲到的,强关系!

        $data=User::store()
                    ->where('aid','=',$params['id'])
                    ->with(['orders'=>function($query){
                        $query->select(DB::raw('user_id,sum(trade_amount) as money,count(trade_amount) as number'))
                        ->where('orders.pay_status','=','2')
                        ->groupBy('user_id');
                        }])
                    ->get();

 

你可能感兴趣的:(PHP框架)