在cakephp中hasMany的字段的总和

时间:2010-10-22 22:49:38

标签: php cakephp cakephp-1.3

我在cakephp中有两个模型,Link和Vote。

我想获得Link模型中每个链接的投票总和。 这是我的findAll函数的打印:

[1] => Array
    (
        [Link] => Array
            (
                [id] => 1
                [url] => http://www.google.com
                [date_added] => 2010-08-19 11:36:56
                [valid] => 1
            )

        [Vote] => Array
            (
                [0] => Array
                    (
                        [link_id] => 1
                        [user_id] => 0
                        [vote] => 3
                    )

                [1] => Array
                    (
                        [link_id] => 1
                        [user_id] => 4
                        [vote] => 4
                    )

            )

    )

我想要的是这个(注意投票属性):

[1] => Array
    (
        [Link] => Array
            (
                [id] => 1
                [url] => http://www.google.com
                [date_added] => 2010-08-19 11:36:56
                [valid] => 1
                [votes] => 7
            )

        [Vote] => Array
            (
                [0] => Array
                    (
                        [link_id] => 1
                        [user_id] => 0
                        [vote] => 3
                    )

                [1] => Array
                    (
                        [link_id] => 1
                        [user_id] => 4
                        [vote] => 4
                    )

            )

    )

但我不知道我应该在哪里做投票的总和。

3 个答案:

答案 0 :(得分:0)

您可以在Link模型中创建虚拟字段“votes”。 http://book.cakephp.org/view/1608/Virtual-fields

var $virtualFields = array(    
    'votes' => 'COUNT ...'
);

答案 1 :(得分:0)

尝试使用CakePHP counterCache Sum of a field with hasMany in cakephp

1)在表'links'中添加新字段 - links.vote_count

2)

<?php class Vote extends AppModel {
       var $belongsTo = array(        
              'Link' => array('counterCache' => true)    
       );} 
?>   

3)从现在开始,每次添加或删除与Link关联的投票时,vote_count中的数字都会自动调整。

答案 2 :(得分:0)

我知道这是2010年的一个主题,但我在这方面遇到了很多麻烦,这也是Google的第一个结果。

另一种选择是在父链接模型中使用afterFind,如下所示:

public function afterFind($results, $primary = false) {

    if(($this->findQueryType=='count') || $primary == false) return $results;

    foreach ($results as $key => $val) {
        if(isset($val['Vote'])) {
            $votes = Hash::extract($val, 'Vote.{n}.vote');
            $results[$key]['Link']['votes'] = array_sum($votes);
        }
    }

    return $results;
}

现在,只要你在返回投票对象的链接上执行find()(例如,当使用&#39;包含&#39;来调用查找时),你的链接对象将包含投票总和。