2013-05-12 18 views
0

我在我的ArticlesController試圖顯示按文章DESC數量排序的頂級文章海報列表。該表還需要顯示用戶具有的總點數(無訂單)。當我計算文章總數或點數總和時,它可以正常工作,但當我嘗試同時計算兩個數字時,它會返回每個文章的錯誤值。例如,如果用戶在文章列表中有5條記錄,並且在積分表中有10條記錄(對於總數爲50分,每條5分),則會輸出用戶有50篇文章和250分。多個計算字段使用可鏈接行爲不起作用

$this->paginate = array(
    'fields' => array(
     'User.username', 'User.online', 
    ), 
    'conditions' => array(
     'Article.page_id' => $page_id, 
     'Article.status_id BETWEEN ? AND ?' => array(2,6), 
     'Point.page_id' => $page_id, 
    ), 
    'link' => array(
     'Article' => array(
      'fields' => array(
       'Article.id', 'COUNT(Article.id) AS articles' 
      ) 
     ), 
     'Point' => array(
      'fields' => array(
       'Point.id', 'SUM(Point.amount) AS page_points' 
      ) 
     ), 
    ), 
    'group' => 'User.id', 
    'order' => 'articles DESC, User.username ASC', 
    'limit' => 35, 
    'contain' => array(
     'Avatar' => array(
      'fields' => array(
       'Avatar.file' 
      ) 
     ), 
    ) // contain 
); 

$this->set('users', $this->paginate('User')); 

回答

1

那麼問題仍然存在與多個計算字段使用可鏈接行爲導致計算結果偏斜。返回的數字乘以每個其他鏈接模型的行數。

下面實際上完成了我想要的,但更好,因爲它適用於分頁排序。

$this->User->virtualFields['page_points'] = "(select SUM(amount) 
    from points as Point 
    where Point.user_id = User.id 
    AND Point.page_id = $page_id 
)"; 

$this->User->virtualFields['page_articles'] = "(select COUNT(Post.id) 
    from posts as Post 
    where Post.user_id = User.id 
    AND Post.page_id = $page_id 
    AND Post.status_id BETWEEN 2 AND 6 
    AND Post.module_id = $module_id 
)"; 

$this->paginate = array(
    'fields' => array(
     'User.id', 'User.username', 'User.online', 'User.points', 'User.page_points', 'User.page_articles' 
    ), 
    'link' => array(
     'Post' => array(
      'fields' => array(
       'Post.id' 
      ), 
     ), 
    ), 
    'group' => 'User.id', 
    'order' => 'User.page_articles DESC, User.username ASC', 
    'limit' => 10, 
    'contain' => array(
     'Avatar' => array(
      'fields' => array(
       'Avatar.file' 
      ) // avatar fields 
     ), // avatar 
    ) // contain 
); // paginate 

$this->set('users', $this->paginate('User')); 

顯然,如果我還沒有鏈接到郵政模式它不工作。所以我鏈接到Post模型並獲得一個id。查詢速度似乎不成問題。我無法計算鏈接內的帖子,否則我將無法在分頁器排序中使用結果。