2010-07-06 2 views
0

태그와 사람에 대해 다 대 다 관계가있는 데이터베이스가 있습니다. 여러 태그가있는 사람을 검색하려고하면 문제가 발생합니다.doctrine에서 여러 태그를 검색하는 방법

 $person = Doctrine_Query::create() 
     ->from("Model_Person p") 
     ->innerJoin("p.tags t") 
     ->whereIn('t.id',$t) 
     ->execute(); 

위의 문은 배열 $ t의 태그 중 하나 이상을 가지고 모든 사람을 반환하지만, 그 하벨 해당 배열에 '모든'태그 유일한 사람을 원한다. 나는이 있지만 실패 시도

누구나이 방법을 알고 있습니까?

감사

+0

알아 냈습니까? –

답변

1

이 때문에 IN 반환 적어도 하나 개의 일치하는 모든 결과. id IN(1,2,3)이 있다면 id = 1 OR id = 2 OR id = 3과 같습니다.

원하는 목표를 달성하려면 Doctrine의 andWhere() 메소드를 각각의 값이 $t 인 것으로 사용하십시오. 예 : [...]->andWhere('id = ?', 1)->andWhere('id = ?', 2)->[...]

+0

나는 비슷한 문제를 겪고 있으며 이것은 정답이 아니다. @rizidoro는 많은 >> tags <<가있는 사람을 한 번에 검색하는 것에 대해 묻는다. –

0

내가 연구 한 시간이 지나면 필자는 필자가 원하는대로 정확하게 작동하는 순수한 SQL 코드를 발견하고 채택했습니다. 내 애플 리지도의 사람 테이블은 정보 테이블입니다.

//$tagQueryString contains tags separated by space ex. "crisis usa"  
    $tagsArray = explode(' ', $tagQueryString); 
    $tagsArrayQuery = '"' . implode('","', $tagsArray) . '"'; 
    //$tagsArrayQuery='"crisis","usa"; 


    $fromQuery = 
      ' 
     info i 
    INNER JOIN (SELECT it.info_id 
       FROM  info_tag it 
         INNER JOIN info i 
          ON i.id = it.info_id 
         INNER JOIN tag t 
          ON t.id = it.tag_id 
       WHERE t.name IN (' . $tagsArrayQuery . ') 
       GROUP BY it.info_id 
       HAVING COUNT(it.info_id) = ' . count($tagsArray) . ') ii 
    ON i.id = ii.info_id'; 

    $query = new Doctrine_RawSql(); 
    $query->select('{i.*}'); 
    $query->from($fromQuery); 
    $query->addComponent('i', 'Model_Info i'); 

    //you can add offset and limit for pagination 
    $infos = $query->limit($resultsPerPage) 
        ->offset($resultsPerPage * ($currentPage - 1)) 
        ->execute(); 

그건 멋진 코드는 아니지만 잘 동작합니다. 나는 그것을 "교리와 비슷한"방식으로 더 잘 이해하지 못합니다. 비슷한 문제에 대한 다른 해결책은 다음과 같습니다. http://www.sergiy.ca/how-to-write-many-to-many-search-queries-in-mysql-and-hibernate

관련 문제