如何从一个包含的表中返回一个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') 

但是,数据在任何返回的实体中都不可用。我在哪里可以找到我的汇总数据?

+0

现在无法对其进行测试,因此我将其留作评论,尝试将外键添加到选择字段列表。除此之外,我认为你必须重新格式化数据以防止这种情况发生,也许你应该考虑使用[** counter caches **](http://book.cakephp.org/3.0/en/ orm/behaviors/counter-cache.html)。 – ndm 2014-12-02 01:07:23

+0

我目前只是返回整个数据并使用收集方法进行聚合,但我宁愿在数据库中执行。 – 2014-12-02 08:41:00

我已经做了一些重构,并将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); 
}