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

Php 如何从多对多关系中正确检索记录(条令-DQL查询),php,mysql,symfony,doctrine-orm,dql,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',

我有以下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和DDLSethemes表之间除外。存在导致问题的多对多关系(ddlProducts和DDLSethemes),它会导致以下错误:

错误:在时超过了30秒的最大执行时间 /供应商/doctrine/orm/lib/doctrine/orm/Internal/Hydration/AbstractHydrator.php:296)“}


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

查询和填充9个不同互联实体的集合就可以做到这一点。 但是,如果没有对整个模型的更多了解,我们就不能说在查询中可以更改什么

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


这实际上取决于您需要什么,将复杂的结果集混合到对象树中是一项昂贵的操作。随着输入大小的增长(数据库中的行越来越多),以及您将更多实体连接到树中(多对多关联),构建对象树需要越来越多的时间。在数学中,您的问题描述了


您可以尝试所谓的。

错误是在php中出现的,因此您必须在php.ini max_execution_time中增加php时间execuetaion。我不想走这条路。我想优化查询,这样它就不会花那么长的时间运行。您应该调试并检查查询是否正常工作……为此临时添加=>“设置时间限制(0);“如果查询成功执行,那么我认为我们可以优化afterwardscan您可以使用getOneOrNullResult来放置此查询的结果避免最长时间执行错误AJAX调用使用结果集来填充表单中的select元素。在这种情况下,您可能不需要在一个巨大的表中包含所有内容。您可以在separ上检索表ate查询并在单个数组中返回它们,以避免额外的ajax调用。您可能也不需要整个对象。只需选择所需的字段即可