我有一个实体 PointOfSale,它与自己的标签和类别有很多对多的关系,我正在研究如何在我从数据库加载 1k pointOfSales 时优化查询及其标签和类别。
映射:
/**
* @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 序列化器还是 fetch eager,或者我是使用函数从实体获取内容,doctrine 仍然会使用它自己的查询为每个 pointOfSale 获取类别和标签。
有没有办法优化它以在单个查询中使用映射? (分页不是解决方案)
//编辑:另一个选择可能看起来像这样,所有都被选中并且学说实体被映射
$POSqb = $this->createQueryBuilder('pos')
->select('pos','c','t')
->leftJoin('pos.categories','c')
->leftJoin('pos.tags','t')
最佳答案
您可以像这样修改您的查询。
return $this->getEntityManager()->createQuery("SELECT pos, c, t FROM YourBundle:ClassName pos LEFT JOIN pos.categories c LEFT JOIN pos.tags t ")->getResult();
编辑版本。将您的包名和类名放在 FROM 中。如果您不在存储库中执行此操作,请不要忘记添加 use 语句!
关于php - Doctrine ManyToMany 优化许多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29485658/