php - 如果满足第三个模型中的条件,则计算相关模型中的对象
问题描述
我有五个模型:
- 团队
- 季节
- 游戏
- 统计
- Stat_Meta
球队有赛季,赛季有比赛,比赛有数据,每一个数据都与一个stat_meta相关。stat_meta 表基本上是静态的,可以按类型对统计信息进行分类。
我正在处理 Stat_Meta 表中的一个函数,以便我可以调用任何特定的统计类型(或 stat_meta)来计算给定比赛、赛季或球队的范围内。
这对游戏来说真的很容易,因为我只是这样做:
return $this->hasMany('App\Models\Stat', 'stat')->where('game_id', 1)->count();
但是,由于统计数据与赛季或球队没有直接关系(它们是通过与两者相关的游戏而相关的),这变得非常棘手。
我知道这是错误的,但我尝试过(它失败了)也许可以更清楚地说明我在这里想要做什么:
return $this->hasMany('App\Models\Stat', 'stat')->where('game.season_id', 7)->count();
这样做给了我以下错误(有点明显):
未找到列:1054 'where 子句'中的未知列'game.season_id'
经过大量谷歌搜索后,我还没有真正找到任何关于此的信息。有什么想法吗?
解决方案
TL;DR,withCount()
- https://laravel.com/docs/5.8/eloquent-relationships#counting-related-models
也许你可以通过参加赛季来实现这一点,然后是比赛,然后计算你想要的统计数据。它看起来像这样
$statIdenticator = 'somethingYouAreSearchingInStats';
$season = Season::with(['games' => function($q1) use($statIdenticator) {
return $q1->withCount(['stats' => function($q2) use($statIdenticator) {
return $q2->where('statIdenticator', $statIdenticator);
}]);
}])->find($seasonId);
没有测试它,但它应该给你stats_count
每个游戏的参数。此时你只需要这样做$season->games->sum('stats_count')
不要复制 paste,没有足够的关于你的代码的信息来确保它会起作用。