php - Doctrine ManyToMany 优化许多查询

标签 php symfony doctrine-orm

我有一个实体 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/

相关文章:

javascript - $.ajax() 打印一组未打印的 jsonObjects

symfony - 链接到不同 CRUD Controller 的某些操作

php - SQLSTATE[HY000] [2002] :schema:create 时不是目录

php - 通过路由参数过滤和学说查询获取并显示正确的数据

Symfony:将对象传递给 Controller ​​方法

php - 我如何从 Laravel 获取 Controller 中的查询结果 ID?

php - Magento Questions 获取客户详细信息并且 onepage/checkout/success 不发送电子邮件

php - Woocommerce 从不在结帐页面上保存送货地址

javascript - Symfony CMF CSS 未加载 : Resource interpreted as Stylesheet but transferred with MIME type text/html:

forms - 表单提交后,子表单值在接收端显示为空