Сумма поля с hasMany в cakephp - PullRequest
       9

Сумма поля с hasMany в cakephp

0 голосов
/ 23 октября 2010

У меня есть две модели в CakePHP, Link and 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 голосов
/ 11 ноября 2010

Попробуйте использовать CakePHP counterCache Сумма поля с hasMany в cakephp

1) Добавить новое поле в таблицу 'links' - links.vote_count

2)

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

3) С этого момента каждый раз, когда вы добавляете или удаляете голосование, связанное со ссылкой, число в элементе voice_count корректируется автоматически.

0 голосов
/ 05 января 2016

Я знаю, что это ветка 2010 года, но у меня было много проблем с этим, и это первый результат Google.

Другой вариант - использовать afterFind в родительской модели Link, например:

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 () для Link, которая также возвращает объект голосования (например, при вызове find с использованием 'Contain'), ваш объект Link будет содержать сумму голосов.

0 голосов
/ 23 октября 2010

Вы можете создать виртуальное поле «голоса» в вашей модели Link. http://book.cakephp.org/view/1608/Virtual-fields

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