2010-07-06 40 views
0

我有一個數據庫,其中包含標籤和人員之間的多對多關係。當嘗試搜索具有多個標籤的人時,我遇到了麻煩。我試過,但它的失敗:如何在原則中搜索多個標籤

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

上面的語句返回在數組$ T標籤的至少一個所有的人,但我想唯一的人哈維爾「所有」該陣列上的標籤。

任何人都知道如何做到這一點?

感謝

+0

你知道嗎? – 2011-11-30 01:43:43

回答

1

這是因爲IN返回所有的結果與至少一個匹配。假如你有id IN(1,2,3)這跟id = 1 OR id = 2 OR id = 3一樣。

要實現您的期望目標,請使用Doctrine的andWhere()方法,其中每個值現在在$t之間,例如$t[...]->andWhere('id = ?', 1)->andWhere('id = ?', 2)->[...]

+0

我有類似的問題,這不是一個正確的答案,@rizidoro詢問有很多>>標籤<<一次搜索人。 – 2011-11-30 01:43:25

0

經過一段時間的研究,我發現並採用了完全按照我需要工作的純SQL代碼。 在我的應用程序rizidoro的表是信息表。

//$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