如何从多对多关系中正确检索记录(Doctrine - DQL查询)

时间:2017-07-25 11:32:22

标签: php mysql symfony doctrine-orm dql

我有以下DQL查询:

$qb->select('v, b, c, t, p, m, s, f, h')
    ->from('UrlBuilderBundle:Version', 'v')
    ->leftJoin('v.ddlBrands', 'b', 'WITH', 'b.version = v.id AND b.isActive = 1 AND v.isActive = 1')
    ->leftJoin('v.ddlCampaignObjectives', 'c', 'WITH', 'c.version = v.id AND c.isActive = 1')
    ->leftJoin('v.ddlThemes', 't', 'WITH', 't.version = v.id AND t.isActive = 1')
    ->leftJoin('t.ddlProducts', 'p', 'WITH', 'p.isActive = 1')
    ->leftJoin('v.ddlMediums', 'm', 'WITH', 'm.version = v.id AND m.isActive = 1')
    ->leftJoin('m.ddlSources', 's', 'WITH', 's.ddlMedium = m.id AND s.isActive = 1')
    ->leftJoin('v.fields', 'f', 'WITH', 'f.version = v.id AND f.isActive = 1')
    ->leftJoin('f.helpText', 'h', 'WITH', 'h.field = f.id AND h.isActive = 1');

$query = $qb->getQuery();
$versions = $query->getArrayResult();

除了ddlProducts和ddlThemes表之外,所有指定的连接都在具有多对一/一对多关系的表之间。存在多对多关系(ddlProducts和ddlThemes)导致问题,导致以下错误:

  

错误:超过30秒的最大执行时间   /vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:296)"}

有人能指出我正确的方向来解决这个错误吗?

2 个答案:

答案 0 :(得分:0)

那么,查询和填充9个不同互连实体的集合就可以做到这一点。 但是,如果不了解整个模型,我们就无法说出查询中可以更改的内容。

也许您可以尝试查找可以非规范化为其他表的表以避免额外的连接。 或者,如果您不需要一个超级表中的所有内容,也许您可​​以将查询拆分为更多。

这实际上取决于你需要

的结果集

答案 1 :(得分:0)

将复杂的结果集导入对象树是一项昂贵的操作。随着输入大小的增加(来自数据库的更多行)以及将更多实体连接到树(多对多关联),ORM需要越来越多的时间来构建对象树。在数学中,您的问题描述了Bachmann–Landau notation

您可以尝试所谓的Multi-step Hydration