//多对一
//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();