Laravel 5.4 Eloquent SUM和ORDER BY数据透视表列

时间:2017-11-14 22:50:28

标签: php mysql laravel

我需要一个Eloquent查询来检索我的数据库中购买最多的产品。表格为productsproducts_purchasespurchases。产品和购买都有多对多的关系。

数据透视表products_purchases有一个名为quantity的数据透视字段,其中包含购买时购买的产品总数。

我试图得到这样的记录:

$data['most_purchased'] = Products::whereHas('purchases', function($query){
        $query->selectRaw('SUM(products_purchases.quantity) AS qty')->orderBy('qty', 'desc')->groupBy('product_id');
})->get();

但它没有给出准确的数值,这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

此代码有效:

Products::join('products_purchases', 'product.id','=','products_purchases.product_id')
           ->selectRaw('product.*, SUM(products_purchases.quantity) AS qty')
           ->groupBy('product.id')
           ->orderBy('qty', 'desc')
           ->get();

但是,如果不使用join,还有其他“更清洁”的方法吗?

答案 1 :(得分:0)

检索最顶级产品的一种解决方案,如果您可以使用两个查询:

1)检索最顶级产品的ID。这将从数据库中选择一个标量值。

$productId = DB::table('products_purchases')
    ->groupBy('product_id')
    ->orderBy(DB::raw('SUM(quantity)'), 'desc')
    ->value('product_id');

2)检索产品

Product::find($productId);

未经测试,但这个想法成立了。