У меня есть метод пользовательского поиска в моей таблице Matches
, который содержит некоторые другие таблицы, и я хотел бы вернуть суммированное значение для одного из моих содержащихся полей.Как вернуть сумму() из таблицы?
До сих пор у меня есть следующее.
/**
* 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']);
}
Этот код будет исполнять штраф и не производить ошибок. Также проверка закладки SQL в DebugKit показывает, что 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')
Однако данные не доступны ни в одном из возвращенных объектов. Где я могу найти свои агрегированные данные?
Невозможно протестировать его прямо сейчас, поэтому я оставлю его в качестве комментария, попробуйте добавить внешний ключ к избранным полям. Кроме того, я думаю, вам придется переформатировать данные в случае, если это вообще работает, и, возможно, вам следует рассмотреть возможность использования [** counter caches **] (http://book.cakephp.org/3.0/en/ orm/behaviors/counter-cache.html). – ndm
В настоящее время я просто возвращаю все данные и использую методы сбора для агрегации, но я бы предпочел сделать это в базе данных. –