2016-12-30 48 views
1

我有兩個實體(Item & Tag)通過雙向ManyToMany關係鏈接,我想顯示實際(關鍵字)中使用的實體(Tag)記錄其他實體(項目):如何在ManyToMany Doctrine關係中選擇已使用的項目

這裏是我的項目實體:

class Item 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Tag", inversedBy="items") 
    */ 
    private $tags; 
} 

我的標籤enity:

class Tag 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Item", mappedBy="tags") 
    */ 
    private $items; 
} 

現在在我的標籤庫我已經試過這樣:

class TagRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function findAllUsed() 
    { 
     return $this->createQueryBuilder('t') 
      ->leftJoin('t.items', 'items') 
      ->groupBy('items.id') 
      ->having('COUNT(t.id) > 0') 
      ->orderBy('t.name', 'ASC') 
      ->getQuery() 
      ->getResult(); 
    } 
} 

但它沒有給我我期待的結果......任何人都可以幫忙嗎?謝謝!

回答

1

的問題

我沒有測試,但它似乎你的錯誤是計數子句。您正在計數標籤having('COUNT(t.id) > 0')。所以它會返回所有標籤。 另一個錯誤是您按'項目'分組並僅選擇't'。你不需要分組。

解決方案

更改 '標籤' 在having子句 '項目'。

public function findAllUsed() 
{ 
    return $this->createQueryBuilder('t') 
     ->leftJoin('t.items', 'items')    
     ->having('COUNT(items.id) > 0') 
     ->orderBy('t.name', 'ASC') 
     ->getQuery() 
     ->getResult(); 
} 

另一種可能的方式更簡單的是做這樣一個@KevinTheGreat innerJoin,但檢查不會有需要或者where子句中的任何更多:

public function findAllUsed() 
{ 
    return $this->createQueryBuilder('t') 
     ->innerJoin('t.items', 'items')   
     ->orderBy('t.name', 'ASC') 
     ->getQuery() 
     ->getResult(); 
} 
+1

第二種解決方案簡單易行!我應該多學習一點SQL語言......感謝Vinicius! – VinZ

1

我這樣做,從我的頭頂,但它應該工作,我用了一個innerJoin代替leftJoin,然後添加一個地方,以確保您得到的是被鏈接的記錄:

public function findAllUsed() 
    { 
     return $this->createQueryBuilder('t') 
      ->innerjoin('t.items', 'i') 
      ->groupBy('i.id') 
      ->where('i.id = t.items') 
      ->having('COUNT(t.id) > 0') 
      ->orderBy('t.name', 'ASC') 
      ->getQuery() 
      ->getResult(); 
    } 
} 

我用這個例子來制定的答案:Query on a many-to-many relationship using Doctrine with Symfony2

+0

我有錯誤「‘項目GROUP BY’:錯誤:PathExpression無效。預期爲StateFieldPathExpression或SingleValuedAssociationField。「現在。 – VinZ

+0

您是否已將-groupBy('items.id')更改爲('i.id') – KevinTheGreat

+0

您的回答有點多餘。因爲'where('i.id = t.items')'已經包含在內連接中。 –

相關問題