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

197 阅读1分钟

「本文已参与「新人创作礼」活动,一起开启掘金创作之路。」

多对一

`//join 数据在同一级,强关系
a=Order::select(users.aid,users.merchantno,orders.)>join(users,function(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(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 (c=Order::whereHas('user', function (query) {                $query->where('id', '=' ,'800129');          }) ->orderby('id','desc') ->with('user') ->paginate();`

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

商户和门店数据放在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();