2015-04-07 64 views
2

我有實體PointOfSale,它與自己的標籤和類別有許多關係,我正在尋找如何優化查詢,當我從它的標籤和類別加載1k pointsOfSales數據庫時。Doctrine ManyToMany優化了很多查詢

映射:

/** 
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="pointsOfSales", fetch="EAGER") 
* @Serializer\Groups({"detail","list"}) 
* @Serializer\MaxDepth(3) 
* @ORM\JoinTable(name="pointOfSales_tags") 
**/ 
private $tags; 

/** 
* @ORM\ManyToMany(targetEntity="Category", inversedBy="pointsOfSales", fetch="EAGER") 
* @Serializer\Groups({"detail","list"}) 
* @Serializer\MaxDepth(3) 
* @ORM\JoinTable(name="pointOfSale_categories") 
**/ 
private $categories; 

事情是,當我想用​​類別和標籤返回JSON,總有像2K的查詢,而不是一個,我所需要的。

我使用這個查詢:

$POSqb = $this->createQueryBuilder('pos'); 
    ->leftJoin('pos.categories','c'); 
    ->leftJoin('pos.tags','t'); 

    $query = $POSqb->getQuery(); 
    return $query->execute(); 

這並不重要,如果我使用JMS串行或取渴望或我使用函數來獲取從實體內容,仍然學說將獲取類別並用它自己的查詢標記每個pointOfSale。

有沒有辦法優化這個在單個查詢中使用映射? (分頁並不溶液)

//編輯:另一種選擇可能是這樣的,所有的選擇和學說實體映射

$POSqb = $this->createQueryBuilder('pos') 
    ->select('pos','c','t') 
    ->leftJoin('pos.categories','c') 
    ->leftJoin('pos.tags','t') 

回答

2

您可以修改您的查詢這個樣子。

return $this->getEntityManager()->createQuery("SELECT pos, c, t FROM YourBundle:ClassName pos LEFT JOIN pos.categories c LEFT JOIN pos.tags t ")->getResult(); 

已編輯版本。將您的軟件包名稱和類名稱放在FROM中。不要忘記添加使用語句,如果你這樣做不在存儲庫中!

+0

這是不工作,因爲查詢缺少FROM語句,但是當我添加'''從PointOfSale pos'''我得到'''錯誤:類'PointOfSale'沒有定義.'''這是奇怪的。但我不確定是否試圖強制從連接中選擇全部將強制映射實體類。 – zajca

+0

哦,真的。類名必須看起來像「FROM AmoMainBundle:公司c」 – maches