Извлекать только записи, имеющие хотя бы одну связь - PullRequest
2 голосов
/ 22 апреля 2011

Это довольно просто, но, думаю, я никогда не сталкивался с этим раньше.У меня есть Page модель, которая hasMany Comment.Я хотел бы вытащить все страницы, на которых есть хотя бы 1 комментарий, но исключить страницы без них.Когда я смотрю на это, я понимаю, что я не уверен, как это сделать.Я думаю, что я мог бы использовать специальные соединения, но я бы предпочел использовать Containable, если это возможно.Я пытался протестировать not null в условиях Comment и еще одну или две вещи, которые вряд ли сработали, но кажется, что это должно быть возможным.

То, что я сейчас получаю, конечно,все страницы и некоторые из этих записей имеют пустой элемент Comment.Если я смогу, будь любезен, пропусти все лишние мелочи.

Мой find звонок:

    $pages = $this->Folder->Page->find(
      'all',
      array(
        'contain' => array(
          'Comment' => array(
            'order' => array( 'Comment.modified DESC' ),
          ),
          'Folder' => array(
            'fields' => array( 'Folder.id' ),
          ),
        ),
        'conditions' => array(
          'Folder.group_id' => $id,
        ),
      )
    );

Спасибо.

1 Ответ

3 голосов
/ 22 апреля 2011

У вас есть несколько доступных подходов, кроме специальных соединений:

  1. Денормализуйте ваш набор данных и добавьте флаг has_comment к вашей таблице страниц. Добавьте 'Page.has_comment' => 1 к вашим условиям.
  2. Запустите ваш запрос к комментарию с DISTINCT page_id.

    $comments = $this->Folder->Page->Comment->find('all', array(
        'conditions' => array('DISTINCT Comment.page_id'
        'contain' => array(
            'Page' => array(
                    'Folder'
            )
        )
    );
    
  3. Сначала возьмите отдельный набор идентификаторов страниц из таблицы комментариев.

    $page_ids = $this->Folder->Page->Comment->find('list', array(
        'fields' => array('id', 'page_id'),
        'conditions' => array('DISTINCT Comment.page_id'),
    );
    $pages = $this->Folder->Page->find('all', array(
        'conditions' => array('Page.id' => $page_ids),
        'contain' => array(
            ...
        )
    );
    
...