Doctrine ManyToMany优化了许多查询

时间:2015-04-07 06:58:24

标签: php symfony doctrine-orm

我有实体PointOfSale,它与自己的标签和类别有很多很多关系,我正在寻找如何在我从数据库加载1k pointsOfSales及其标签和类别时优化查询。

映射:

    /**
 * @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')

1 个答案:

答案 0 :(得分: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中。如果你不在存储库中这样做,请不要忘记添加使用声明!