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

How to correctly retrieve records from a many to many relationship (Doctrine - DQL query)

我有以下 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),导致以下错误:

Error: Maximum execution time of 30 seconds exceeded at /vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:296)"}

谁能指出解决此错误的正确方向?

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

也许您可以尝试找到 tables 可以将其非规范化为其他一些以避免额外的连接。 或者,如果您不需要一个超级 table.

中的所有内容,也许您可​​以将查询分成更多

这实际上取决于您需要什么结果集

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

你可以试试所谓的Multi-step Hydration