从嵌套的雄辩关系中获得平均值

时间:2017-05-18 17:02:41

标签: mysql laravel laravel-5 eloquent laravel-5.4

我想从雄辩模型之间的嵌套关系计算平均值。所以,让我们说,我有3个名为programsactivitiesstatistics的表。

为简单起见,我将尝试将结构最小化,如下所示:

program表:

-------------
| id | name |
-------------
| 1  | Foo  |
| 2  | Bar  |
-------------

activities表:

-----------------------------------
| id | program_id | name          |
-----------------------------------
| 1  | 1          | Foo 1         |
| 2  | 1          | Foo 2         |
| 3  | 1          | Foo 3         |
| 4  | 2          | Bar 1         |
| 5  | 2          | Bar 2         |
-----------------------------------

statistics表:

-----------------------------------
| id | activity_id | type | score |
-----------------------------------
| 1  | 1           | A    | 25    |
| 2  | 1           | B    | 20    |
| 3  | 1           | A    | 22    |
| 4  | 2           | A    | 27    |
| 5  | 2           | B    | 24    |
| 6  | 3           | A    | 23    |
-----------------------------------

现在,我想得到的是score program的平均值type statistic $program = Program::find(1); $avg = $program->activities->where('statistics.type', 'A')->avg('statistics.value'); 。我在模型中定义了关系,并尝试了以下代码,但无济于事:

where
如果程序中没有活动,即使没有$program->activities子句,

$ avg总是0或null。

我确定我正确定义了这种关系,因为$activity-> statistics会返回一组活动,而def check(self, request, pk=None): obj = self.get_object() 也会返回一组统计信息。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以像这样使用whereHas()

Statistics::whereHas('activity', function ($q) use($programId) {
        $q->where('program_id', $programId);
    })
    ->where('type', 'A')
    ->avg('score');   

确保您已定义activity关系,该关系应为“statistics belongsTo()activity”。