如何从一个包含的表中返回一个sum()?
问题描述:
我在我的Matches
表中有一个自定义查找方法,其中包含一些其他表,并且我想返回其中一个包含字段的总和值。如何从一个包含的表中返回一个sum()?
到目前为止,我有以下几点。
/**
* Custom finder to find the latest matches played
*
* @param Query $query
* @param array $options
* @return $this
*/
public function findLatestMatches(Query $query, array $options) {
return $query->contain([
'Venues' => function ($q) {
return $q->select(['id', 'name', 'location']);
},
'Formats' => function ($q) {
return $q->select(['id', 'name']);
},
'Teams' => [
'Clubs' => function ($q) {
return $q->select(['id', 'image', 'image_dir']);
}
],
'Innings' => [
'InningsTypes',
'Batsmen' => function ($q) {
/* @var \Cake\ORM\Query $q */
return $q->select(['totalRuns' => $q->func()->sum('runs')]);
},
'Bowlers',
'Wickets' => function ($q) {
/* @var \Cake\ORM\Query $q */
return $q->select(['totalWickets' => $q->func()->count('id')]);
}
]
])
->order(['when_played' => 'DESC']);
}
此代码将正常执行并且不会产生错误。同时检查DebugKit中的SQL选项卡显示sql已被执行。
SELECT (SUM(runs)) AS `totalRuns` FROM batsmen Batsmen WHERE Batsmen.innings_id in ('841fce60-0178-450f-99e8-ad1670f5c84f','93daddf5-256b-4420-b636-0db626baae72','b398d1a0-2c7d-41f7-b2c3-8ea00ddfcece','f949bb45-3d8b-46f5-8967-cc1340a9c1e7')
但是,数据在任何返回的实体中都不可用。我在哪里可以找到我的汇总数据?
答
我已经做了一些重构,并将Bowlers门票移到他们自己的自定义查找程序中,以便在此查找程序中使用。
这是我如何走近我的Bowlers定制发现者。
public function findBowlersWickets(Query $query, array $options)
{
return $query->contain([
'Innings' => [
'Wickets' => [
'PlayerBowledWicket',
]
]
])
->select(['totalWickets' => $query->func()->count('*')])
->matching('Innings.Wickets.PlayerBowledWicket', function ($q) {
return $q->where([
'AND' => [
'Wickets.bowler_player_id = Bowlers.player_id',
'Wickets.innings_id = Innings.id'
]
]);
})
->group(['Innings.id', 'Bowlers.player_id'])
->order(['totalWickets' => 'DESC'])
->autoFields(true);
}
现在无法对其进行测试,因此我将其留作评论,尝试将外键添加到选择字段列表。除此之外,我认为你必须重新格式化数据以防止这种情况发生,也许你应该考虑使用[** counter caches **](http://book.cakephp.org/3.0/en/ orm/behaviors/counter-cache.html)。 – ndm 2014-12-02 01:07:23
我目前只是返回整个数据并使用收集方法进行聚合,但我宁愿在数据库中执行。 – 2014-12-02 08:41:00