2014-12-01 2 views
3

У меня есть метод пользовательского поиска в моей таблице 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') 

Однако данные не доступны ни в одном из возвращенных объектов. Где я могу найти свои агрегированные данные?

+0

Невозможно протестировать его прямо сейчас, поэтому я оставлю его в качестве комментария, попробуйте добавить внешний ключ к избранным полям. Кроме того, я думаю, вам придется переформатировать данные в случае, если это вообще работает, и, возможно, вам следует рассмотреть возможность использования [** counter caches **] (http://book.cakephp.org/3.0/en/ orm/behaviors/counter-cache.html). – ndm

+0

В настоящее время я просто возвращаю все данные и использую методы сбора для агрегации, но я бы предпочел сделать это в базе данных. –

ответ

2

С тех пор я сделал немного рефакторинга с этим и переместил калитки 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); 
}