如何从多对多关系中正确检索记录(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。
我有以下 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。