WhereHas与WhereRaw建立一对多关系(Laravel)

时间:2019-03-11 12:12:50

标签: php mysql sql laravel

我的系统中有一个订单表和一个order_details表。 订单表和订单明细表之间的关系是一对多的,这意味着一个订单有很多订单明细。

现在的问题是我正在尝试使用order_details表中存储的项目数量a过滤订单。

我做对的事情知道尝试使用whereHas

if ($request->has('quantity') && $request->quantity != null){
        $query = $query->whereHas('orderDetails',function ($q) use ($request){
            $q->whereRaw('SUM(Quantity) >= '.$request->quantity);
        });
    }
$orders = $query->orderBy('OrderID','desc')->get();

但是会引发错误

General error: 1111 Invalid use of group function (SQL: select * from `orders` where `AddedToCart` = 0 and `PaymentSucceeded` = 1 and exists (select * from `order_details` where `orders`.`OrderID` = `order_details`.`OrderID` and SUM(Quantity) >= 12) order by `OrderID` desc)

如果能找到解决办法,我将不胜感激

1 个答案:

答案 0 :(得分:0)

要使用sum功能,您需要group by数据,并且据我所知,您正在尝试按orderID对它们进行分组。

这样的方法可能会有所帮助:

 $ordersIDs = DB::table('orderDetails')
                    ->groupBy('OrderID')
                    ->havingRaw('SUM(Quantity)', '>=', 12)
                    ->pluck('orderID')->toArray();

    $orders = DB::table('orders')
                    ->whereIn($ordersIDs)
                    ->get();

上面的代码执行两个SQL查询,您可以轻松地将它们混合在一起以构成一个。

希望有帮助。