CakePHP: соединения внутри содержат - PullRequest
1 голос
/ 14 июля 2011

Как видно из заголовка, у меня проблемы с соединениями в моем поисковом запросе, с ошибками, которые выглядят как:

  preg_match() expects parameter 2 to be string, array given [CORE/cake/libs/model/behaviors/containable.php, line 301]

Я пытался добавить joins в массив там, ноэто ничего не изменило.

Это параметры, которые я передаю методу поиска.

$options = array(
   'contain' => array(
      'Answer' => array(
         'conditions' => array('Answer.type' => 'answer'),
         'joins' => array(
            $this->votesJoin()
         ),
         'Comment' => array(
            'conditions' => array('Comment.type' => 'comment'),
            'joins' => array(
               $this->votesJoin()
            )
         )
      ),
      'Comment' => array(
         'conditions' => array('Comment.type' => 'comment'),
         'joins' => array(
            $this->votesJoin()
         )
      ),
      'User',
      'Tag' => array()
   ),
   'joins' => array(
      $this->votesJoin()
   ),
   'conditions' => array(
      'Question.id' => $id
   )
);

return $this->find('first', $options);

с votesJoin(), возвращающим следующий массив.

(
   [table] => (SELECT Vote.node_id, SUM(value) as total FROM votes AS `Vote`   WHERE 1 = 1  GROUP BY `Vote`.`node_id`  )
   [alias] => Vote
   [conditions] => Vote.node_id = Question.id
)

Что я пытаюсь сделать: каждый пользователь может повысить / понизить значение узла (вопрос / ответ / комментарий).В соединении я пытаюсь добавить сумму этих голосов. база данных http://github.com/navale/QA/wiki/img/datamodel.png

1 Ответ

1 голос
/ 15 июля 2011

Вы должны использовать «соединения» только для вещей, которые не могут быть сделаны с отношениями модели Cake и Containable.Я не знаю деталей вашей базы данных, но я думаю, что операция поиска может быть упрощена.Почему бы вам не опубликовать схему для этих таблиц здесь?

попробуйте это:

$options = array(
'contain' => array(
  'Answer' => array(
     'conditions' => array('Answer.type' => 'answer'),
     'Vote' => array(
        'fields' => array('SUM(Vote.value)'),
        'group'  => array('Vote.parent_id')
     ),
     'Comment' => array(
        'conditions' => array('Comment.type' => 'comment'),
        'Vote' => array(
                        'fields' => array('SUM(Vote.value)'),
                        'group'  => array('Vote.parent_id')
                 )
     )
  ),
  'Comment' => array(
     'conditions' => array('Comment.type' => 'comment'),
     'Vote' => array(
        'fields' => array('SUM(Vote.value)'),
        'group'  => array('Vote.parent_id')
     )
  ),
  'User',
  'Tag' => array()

), 'condition' => array ('Question.id' => $ id));

Вы получаете значение суммы голосов для каждого ответа, комментария и комментария для ответа.(Возможно, вам понадобится добавить голосование «hasMany» в модель узла, если вы еще этого не сделали)

Если вместо этого вы хотите получить одну единственную общую сумму голосов за вопрос, то я бы предложил: получить список ответов и комментариев на вопрос:

$ lvl1 = find ('list', 'fields' => array ('id'), 'condition' => array ('Node.parent_id' => $ id))

, затем получите список комментариев ответов

$ lvl2 = find ('list', 'fields' '=> массив ('id'), 'условия' => массив ('Node.parent_id' => $ lvl1))

, затем просто объедините массив 2, а затем сложите с ним сумму.

...