我有以下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)"}
有人能指出我正确的方向来解决这个错误吗?
答案 0 :(得分:0)
那么,查询和填充9个不同互连实体的集合就可以做到这一点。 但是,如果不了解整个模型,我们就无法说出查询中可以更改的内容。
也许您可以尝试查找可以非规范化为其他表的表以避免额外的连接。 或者,如果您不需要一个超级表中的所有内容,也许您可以将查询拆分为更多。
这实际上取决于你需要
的结果集答案 1 :(得分:0)
将复杂的结果集导入对象树是一项昂贵的操作。随着输入大小的增加(来自数据库的更多行)以及将更多实体连接到树(多对多关联),ORM需要越来越多的时间来构建对象树。在数学中,您的问题描述了Bachmann–Landau notation。
您可以尝试所谓的Multi-step Hydration。