2014-12-01 65 views
3

我在我的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

回答

2

我已經做了一些重構,並將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); 
} 
相關問題