2012-06-01 119 views
1

我正在創建一個具有與其他對象具有多個多對多關係的實體的應用程序。讓我來佈局的實體:Doctrine2複雜的多對多搜索查詢

  • 輸入=的主要對象
  • 地區=必須通過「_entry_region」參考表許多一對多與輸入
  • 類型=有許多一對多通過入口「_entry_type」參考表
  • 標籤=必須通過「_entry_tag」參考表

現在在前臺,用戶可以設置一些過濾器對於需要加載項多到多用條目。在人類語言中,查詢需要像這樣。

Get the entries WHERE region is (1 or 2 or 3) AND type is (3 or 4 or 5) AND tag is (4 OR 6 or 1) 

我目前蔣張關係着這片代碼:

$query = $this->em->createQuery('SELECT m.id FROM Entity\Entry e WHERE :region_id MEMBER OF e.regions); 
$query->setParameter('region_id', 1);  
$ids = $query->getResult(); 

這給了我相應區域的條目的的ID的。但不可能在setParameter()中添加區域ID的數組。我也不能在該文檔中找到如何做到這一點的就像我的人基於查詢多個相關實體:

Get the entries WHERE region is (1 or 2 or 3) AND type is (3 or 4 or 5) AND tag is ( 

回答

4

您也可能會考慮看看D2查詢生成器。比較詳細的一點,但是一旦你把語法向下,構建更復雜的查詢就容易多了。

喜歡的東西:

$qb = $this->em->createQueryBuilder(); 

    $qb->addSelect('entry'); 
    $qb->addSelect('region'); 
    $qb->addSelect('type'); 
    $qb->addSelect('tag'); 

    $qb->from('MyBundle:Entry', 'entry'); 
    $qb->leftJoin('entry.regions','region'); 
    $qb->leftJoin('entry.types', 'type'); 
    $qb->leftJoin('entry.tags', 'tag'); 


    $qb->andWhere($qb->expr()->in('region.id',$regions)); 
    $qb->andWhere($qb->expr()->in('type.id', $types)); 
    $qb->andWhere($qb->expr()->in('tag.id', $tags)); 
+0

這比我在做什麼好多了,你不必擔心消毒。 –