Laravel 带分页的 OrderBy 关系计数

Laravel OrderBy Relationship count with pagination

我有很多项目,每个项目都有很多订单,有的完成了,有的没有。

我想按照完成订单的数量来订购它们:

$products = $products->orderBy(function($product) {
    return $product->orders->where('status', 2)->count();
})->paginate(15);

我知道订单调用不是这样工作的,但这是显示问题的最佳方法。 SortBy 不起作用,因为我想使用分页。

如果有效,试试这个:

    $categories = Prodcuts::with(array('orders' => function($query) {
       $query->select(DB::raw('SELECT * count(status) WHERE status = 2 as count'))
        $query->orderBy('MAX(count)')
     }))->paginate(15);

    return View::make('products.index', compact('categories'));

注意:这个没有测试过

终于找到解决问题的好办法:

$products = $products->join('orders', function ($join) {
                        $join->on('orders.product_id', '=', 'products.id')
                            ->where('orders.status', '=', 2);
                    })
                    ->groupBy('products.id')
                    ->orderBy('count', $order)
                    ->select((['products.*', DB::raw('COUNT(orders.product_id) as count')]))->paginate(50);

从 5.2 开始,您可以使用 withCount 来计算关系结果。

在这种情况下

$products = $products->withCount(['orders' => function ($query) {
    $query->where('status', 2);
}]);

参考:https://laravel.com/docs/5.2/eloquent-relationships