ВНУТРЕННЕЕ СОЕДИНЕНИЕ С ГРУППА ПО CakePHP - PullRequest
1 голос
/ 19 марта 2012

Я пишу подключаемый модуль для системы, которая использует CakePHP 1.2, и я новичок в этой среде. Как выполнить следующий запрос Cake way?

SELECT a.id, a.name, COUNT(a.id) AS comments
FROM articles a LEFT JOIN comments c ON a.id = c.item_id
GROUP BY a.id
ORDER BY comments DESC;

Я не могу редактировать модели Article или Comment, но я пытаюсь это сделать в модели моего плагина, и она не дает того же результата:

$this->loadModel('Article');
$options['fields'] = array('Article.id', 'Article.name', 
              'COUNT(Article.id) AS comments');
$options['joins'] = array(
    array('table' => 'comments',
          'alias' => 'c',
          'type' => 'INNER',
          'conditions' => array(
          'Article.id = c.item_id')
         ));
$options['group'] = array('Article.id');
$options['order'] = 'comments DESC';
$options['limit'] = 5;
$rows = $this->Article->find('all', $options);

Кроме того, я не уверен, но думаю, что класс Article может уже иметь:

 public $actsAs = array('Containable');
 public $hasMany = array('Comment');

Ответы [ 2 ]

3 голосов
/ 19 марта 2012

Я думаю, вам также нужно добавить foreignKey => FALSE к определению вашего соединения:

$options['joins'] = array(
    array('table' => 'comments',
          'alias' => 'c',
          'type' => 'INNER',
          'foreignKey' => FALSE,
          'conditions' => array('Article.id = c.item_id')
     )
);

Кроме того, если вы сами форсируете соединения, вы должны избавиться от любых предыдущих ассоциаций в стиле Cake, либопередавая recursive => FALSE в качестве опции или применяя unbindModel к каждой связанной модели.

ОБНОВЛЕНИЕ

В зависимости от того, что вы сказалив комментариях вот что мне нужно:

$options['fields'] = array(
    'Article.id', 
    'Article.name', 
    'COUNT(DISTINCT c.id) AS comments'
);
$options['joins'] = array(
    array(
        'table' => 'comments',
        'alias' => 'c',
        'type' => 'LEFT OUTER',
        'foreignKey' => FALSE,
        'conditions' => array('Article.id = c.item_id')
    )
);
$options['group'] = array('Article.id');
$options['order'] = 'COUNT(DISTINCT c.id) DESC';
$rows = $this->Article->find('all', $options);
1 голос
/ 21 марта 2012

Очень неожиданный ответ:

Версия CakePHP, используемая этим проектом (с которой я ничего не могу поделать), является бета-версией 1.2.0.6311, выпущенной 2008-01-02 и согласно этой статье. группировка по функциональности в методе поиска модели Cake была добавлена ​​только в мае 2008 года

...