2015-04-07 42 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