CakePHP: соединения внутри содержат

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

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

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

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

$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


person marijnvdwerf    schedule 14.07.2011    source источник
comment
так что вы хотите получить: вопрос, комментарии к вопросу, ответы, комментарии к ответам и в сумме голосов за все эти элементы... и все в одном запросе... кажется мне довольно амбициозным = п   -  person pleasedontbelong    schedule 15.07.2011
comment
Нет, я знаю, что мне понадобятся разные запросы на вопрос, ответы и комментарии, но я хотел бы присоединиться к голосам по этим запросам...   -  person marijnvdwerf    schedule 15.07.2011
comment
Ваш $this->votesJoin() возвращает массив? Тогда вам не следует оборачивать его в еще один массив.   -  person lxa    schedule 15.07.2011
comment
Кроме того, вам, вероятно, следует переименовать свои таблицы в соответствии с соглашениями о тортах. , что сэкономит вам немного волос.   -  person lxa    schedule 15.07.2011
comment
веб-сайт CakePHP также помещает каждое соединение в массив ;)   -  person marijnvdwerf    schedule 15.07.2011
comment
@Ixa, какие из них вы имеете в виду? только question_views или также разделить таблицу узлов?   -  person marijnvdwerf    schedule 15.07.2011


Ответы (1)


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

), 'условия' => массив ('Question.id' => $id));

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

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

$lvl1 = найти('список','поля'=>массив('id'),'условия'=>массив('Node.parent_id'=>$id))

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

$lvl2 = найти('список','поля'=>массив('id'),'условия'=>массив('Node.parent_id'=>$lvl1))

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

person Anh Pham    schedule 15.07.2011
comment
Добавил схему, что еще вы хотели бы знать? - person marijnvdwerf; 15.07.2011
comment
Извините, не работает. Containable видит «группу» как поле... Думаю, я просто получу идентификаторы всех найденных комментариев и ответов и просто найду отдельное голосование в этом массиве... Спасибо за вашу помощь;) - person marijnvdwerf; 16.07.2011
comment
В самом деле? это странно: гайки-и-болты-из-тортаphp.com/2009/10/06/ - person Anh Pham; 17.07.2011