我想从雄辩模型之间的嵌套关系计算平均值。所以,让我们说,我有3个名为programs
,activities
和statistics
的表。
为简单起见,我将尝试将结构最小化,如下所示:
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()
也会返回一组统计信息。
有什么想法吗?
答案 0 :(得分:2)
您可以像这样使用whereHas()
:
Statistics::whereHas('activity', function ($q) use($programId) {
$q->where('program_id', $programId);
})
->where('type', 'A')
->avg('score');
确保您已定义activity
关系,该关系应为“statistics belongsTo()activity”。