在Laravel中,我们可以使用withCount方法对相关模型属性求和吗?

时间:2017-04-29 10:39:39

标签: laravel

我有3个相关的模型如下: 奖品 - > TimeSlot - >获胜者及其相应的关系方法$ prize-> hasMany(TimeSlot)和$ prize-> hasManyThrough(Winner,TimeSlot)。

我试图在一个雄辩的问题中计算获胜者的数量和时间段的数量。

以下是查询:

$prizes = $prizes->withCount(['winners', 'timeSlots' => function ($query) {
    $query->sum('min'); // min is an attribute on TimeSlot
}])->get();

这为我提供了每个奖项都有'winners_count'属性的获奖者数量。我认为它会给我每个奖项的时间段的“总和”,但是查询在那个部分打破了一个错误,如:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'prizes.id' in 'where clause' 
(SQL: select sum(`min`) as aggregate from `time_slots` where `time_slots`.`prize_id` = `prizes`.`id`)

withCount方法的文档仅显示如何约束查询(例如使用where子句),但不显示像sum这样的聚合。

P.S:我已经知道如何用以下方法做到这一点:

$prizes = $prizes->with('timeSlots')->withCount('winners')->get();

$numOfWinners = $prizes->sum('winners_count');

$numOfAvailablePrizes = $prizes->sum(function ($prize) {
    return $prize->timeSlots()->sum('min');
});

但我认为带有一个查询的版本会为我节​​省一些无用的循环......

感谢您的回答!

1 个答案:

答案 0 :(得分:2)

试试这个

$query->withCount(['timeSlots AS timeslots_sum' => function ($query) {
    $query->select(DB::raw('SUM(min) as timeslots_sum'));
}]);

它将返回

"timeslots_sum" => "123" // total