2016-03-01 42 views
1

不知道這裏的標題是否有點模棱兩可,但基本上我試圖做的是從數據庫中獲取數據,但我需要引用連接表沒有自己的實體,因爲它只在另一個實體中被引用。如何在沒有實體的原則查詢中加入連接表

這是我的設置。我有一個Symfony2項目,我有一個數據庫中的階段列表,每個階段可以在一個或多個類別。我需要抓住特定類別的所有階段,並按相關排序順序排列。如果我在MySQL直接這樣做,我會寫:

SELECT s.stage FROM stage s LEFT JOIN stage_category sc ON sc.stage_id = s.id WHERE sc.category_id = 1 ORDER BY s.sort_order 

但問題是,「stage_category」連接表有沒有實體,所以如果我在我的學說查詢引用它,它告訴我它不存在。我寫它:

$qb = $this->createQueryBuilder('s') 
      ->select('s') 
      ->join('stage_category','sc') 
      ->where('sc.category_id = :cat') 
      ->setParameter('cat', $cat); 

雖然不能完全肯定,如果這是正確的 - 這是在我的倉庫類名爲findStagesInCategory()方法。

/** 
* @var \Doctrine\Common\Collections\Collection 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category", inversedBy="stage", cascade={"remove", "persist"}) 
* @ORM\JoinTable(name="stage_category") 
* @ORM\JoinColumn(onDelete="SET NULL") 
*/ 
private $category; 

而且在反方:

/** 
* @var \Doctrine\Common\Collections\Collection 
* 
* @ORM\ManyToMany(targetEntity="Stage", mappedBy="category", cascade={"remove", "persist"}) 
*/ 
private $stage; 

有中能夠得到我所需要的數據的任何可行辦法?

回答

5

Stage和Category之間沒有實體的原因是因爲該關係中沒有任何其他證據證明實體的存在(這就是爲什麼它是manyToMany)。

你想要做的是抓取連接和過濾的關係:

$qb = $this->createQueryBuilder('s') 
     ->select('s') 
     ->join('s.category','c') 
     ->where('c.category_id = :cat') 
     ->setParameter('cat', $cat); 

另外,如果stage_category將有正當理由的實體存在的屬性,你會改變你的映射是一個一對多和多對一,這將允許您使用查詢構建器執行原始查詢。