2011-04-22 4 views
2

이것은 매우 간단하지만 이전에 결코 부딪치지 않았다고 생각합니다. 나는 hasMany Comment 모델 Page 있습니다. 적어도 1 개의 주석이있는 모든 페이지를 가져오고 싶지만 아무 것도없는 페이지는 제거하고 싶습니다. 내가 그것을 보았을 때, 어떻게해야할지 모르겠다. 임시 조인을 사용할 수 있다고 생각하지만 가능한 경우 Containable을 사용하고 싶습니다. 조건에서 not null 테스트를 시도했지만 작동하지 않을 가능성이있는 하나 또는 두 가지 다른 것들을 시도했지만 이것이 가능해야합니다.최소한 하나의 연결 만 사용하여 레코드를 검색하십시오.

물론 지금은 모든 페이지가 있고 일부 페이지 레코드에는 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, 
     ), 
    ) 
    ); 

감사합니다.

답변

3

당신은 임시보다 몇 접근 가능한 다른이 조인

  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. 먼저 주석 테이블에서 고유 한 페이지 ID 집합을 가져옵니다.

    $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(
         ... 
        ) 
    ); 
    
+0

좋은 제안, 내가 옵션을 세 가지로 갈거야. – 472084

관련 문제