【问题标题】:How to correctly retrieve records from a many to many relationship (Doctrine - DQL query)如何从多对多关系中正确检索记录(Doctrine - DQL 查询)
【发布时间】:2017-07-25 11:32:22
【问题描述】:

我有以下 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)"}

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

【问题讨论】:

  • php 中的错误,所以你必须在 php.ini max_execution_time 中增加 php time execuetaion
  • 我不想走这条路。我想优化查询,使其运行时间不长。
  • 您应该调试并检查查询是否正常工作...为此暂时添加 => "set_time_limit(0);"如果查询成功执行,那么我认为我们可以在之后进行优化
  • 你能把这个查询的结果用getOneOrNullResult yo避免最大时间执行错误

标签: php mysql symfony doctrine-orm dql


【解决方案1】:

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

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

这真的取决于你需要什么结果集

【讨论】:

  • AJAX 调用使用结果集来填充表单中的选择元素。
  • 在这种情况下,您可能不需要一张大桌子上的所有东西。您可以在单独的查询中检索表并在单个数组中返回它们以避免额外的 ajax 调用。您可能也不需要整个对象。只需选择您需要的字段
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多