使用可链接行为不起作用的多个计算字段

时间:2013-05-12 20:44:24

标签: cakephp behavior cakephp-2.2

我在我的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 个答案:

答案 0 :(得分: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模型,它就不起作用。所以我链接到Post模型,只获得一个id。查询速度似乎不是问题。我无法计算linkable中的帖子,否则我将无法在分页器排序中使用结果。