2014-11-19 3 views
0

Я хотел бы понять joins в CakePHP (ст 2.4.5) немного лучше, решая следующий пример:РЕГИСТРИРУЙТЕСЬ в CakePHP - лучшее понимание

Post hasMany Comment
Post.id == Comment.post_id
Comment.published может быть 1 или 0

  • Мне нужно найти все сообщения, которые имеют по крайней мере один опубликован комментарий
  • Я хочу написать запрос от модели Post. Для того, чтобы не нарушать нумерацию страниц, и поэтому я могу добавить заказ/условия, основанные на Post
  • Я не хочу, чтобы отфильтровать результаты впоследствии в PHP (для того, чтобы не нарушать нумерацию страниц)

Вы могли бы предложить подойти этот вопрос из Comment модели, как здесь:
https://stackoverflow.com/a/3890461/155638
Но это про понимание присоединяется лучше, поэтому я хотел бы установить требование, чтобы написать запрос от Post модели.

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

$this->Post->find('all', array(
    'joins' => array(
     array(
      'table' => 'comments', 
      'alias' => 'CommentsJoined', 
      'type' => 'RIGHT', 
      'conditions' => array(
       'Post.id = CommentsJoined.post_id', 
       'CommentsJoined.published = true' 
      ) 
     ) 
    ), 
    'contain' => array(
     'Comment' => array(
      'conditions' => array(
       'Comment.published' => 1 
      ) 
     ) 
    ) 
); 

Но это не сработало для меня пока.
В настоящее время мой запрос возвращает 19 раз тот же пост, а не 19 уникальных сообщений.

Как это сделать? Правильно ли этот подход?

С уважением!
Bart

ответ

1

Кажется, я был на правильном пути. Последним шагом было удаление дубликатов сообщений.
Это делается добавлением 'group' => 'Post.id' в качестве атрибута запроса.

Как это:

$this->Post->find('all', array(
    'joins' => array(
     array(
      'table' => 'comments', 
      'alias' => 'CommentsJoined', 
      'type' => 'RIGHT', 
      'conditions' => array(
       'Post.id = CommentsJoined.post_id', 
       'CommentsJoined.published = true' 
      ) 
     ) 
    ), 
    'group' => 'Post.id', 
    'contain' => array(
     'Comment' => array(
      'conditions' => array(
       'Comment.published' => 1 
      ) 
     ) 
    ) 
);