Laravel:计算关系中的行数

时间:2017-10-03 13:54:16

标签: laravel laravel-5 eloquent laravel-5.1

我有以下关系:

  • 场地有很多优惠
  • 报价有很多订单

我有以下Eloquent模型来表示:

class Venue {
    public function orders()
    {
        return $this->hasManyThrough(Order::class, Offer::class);
    }
}

我想使用Laravel的Eloquent模型确定location_id = 5场地的总订单数。

我设法做到这一点的唯一方法如下:

$venues = Venue::where('location_id', 5)->with('orders')->get();

$numberOfOrders = 0;
foreach($venues as $venue) {
    $numberOfOrders += $venue->orders->count();
}
dump($numberOfOrders); // Output a single number (e.g. 512)

然而,这显然不是很有效,因为我使用PHP而不是SQL来计算计数。

我怎样才能单独使用Eloquent模型。

3 个答案:

答案 0 :(得分:5)

您可以使用Eloquent。从Laravel 5.3开始,有withCount()

在你的情况下,你将有

$venues = Venue::where('location_id', 5)->with('orders')->withCount('orders')->get();

然后以这种方式访问​​

foreach ($venues as $venue) {
    echo $venue->orders_count;
}

可在此处找到参考:https://laravel.com/docs/5.3/eloquent-relationships#querying-relations

答案 1 :(得分:1)

如果您使用的是Laravel 5.3或更高版本,则可以使用withCount

  

如果您想计算没有关系的结果数   实际加载它们你可以使用withCount方法,这将   在结果模型上放置{relation} _count列。例如:

$venues = Venue::withCount(['orders'])->get;

foreach ($venues as $venue) {
    echo $venue->orders_count;
}

您可以在Laravel Documentation.

中详细了解withCount

如果您使用的价格低于5.3,则可以在Venue型号上建立自定义关系:

public function ordersCount()
{
    return $this->belongsToMany('App\Models\Order')
        ->selectRaw('venue_id, count(*) as aggregate_orders')
        ->groupBy('venue_id');
}

public function getOrderCount()
{
    // if relation is not loaded already, let's do it first
    if (!array_key_exists('ordersCount', $this->relations)) {
        $this->load('ordersCount');
    }

    $related = $this->getRelation('ordersCount')->first();
    // then return the count directly
    return ($related) ? (int) $related->aggregate_orders : 0;
}

然后可以用作:Venue::with('ordersCount');。这种自定义关系的好处是你只是查询计数而不是在没有必要时查询所有这些关系。

答案 2 :(得分:1)

$venues = Venue::with([
    'orders' => function ($q) {
        $q->withCount('orders');
    }
])->get();

然后以这种方式使用它获取单个记录

$venues->first()->orders->orders_count();

或者,您也可以使用这种方式来收藏

foreach($venues as $venue)
{
echo $venue->order_count;
}