【问题标题】:Doctrine custom DQL or Loop for performance in Symfony2用于 Symfony2 中性能的 Doctrine 自定义 DQL 或循环
【发布时间】:2013-06-05 20:33:32
【问题描述】:

一个公司对象可以有多个站点对象。 对于给定的公司,我想知道主站点。 (isPrimary 是 Site 的一个属性)。

我在 Company 类中编写了一个名为 getPrimarySite() 的函数,并像这样实现它。

public function getPrimarySiteForCompany()
    {
        foreach($this->getSite() as $site)
        {
            if($site->isPrimary())
            {
                return $site;
            }
        }

        return false;
    }

这样可以吗,还是在 CompanyRepository 中编写自定义存储库函数更好,我可以在其中使用 DQL 获取主站点?

【问题讨论】:

  • 就目前的方式来说可能没问题。您始终可以使用分析器来确定它是否会减慢速度。我曾经花费大量精力进行自定义查询以最大程度地减少延迟加载。但对于我的模型来说,简单的基准测试显示的努力几乎没有收获。

标签: php performance symfony doctrine-orm dql


【解决方案1】:

如果公司只能有一个主站点,自然的解决方案是向公司实体添加一个新属性Company::$primarySite。这将是 [One|Many]ToOne 关系(取决于一个站点是否可以属于多个公司)。查找会很快,然后您的数据层会强制执行公司只能拥有一个主站点的逻辑。这比在网站上设置 isPrimary 标志更有意义,然后必须确保属于同一公司的两个网站没有同时设置该标志。

【讨论】:

    【解决方案2】:

    虽然编写自定义存储库函数来加入数据并防止延迟加载并不难,但这是premature optimization 的一个很好的例子。

    暂时保持原样,一旦一切都在生产中正常运行,您可以返回开发并使用分析器查看性能方面可以改进的地方。此外,如果您只期望几个 Site 对象,那么它可能并不重要,如果有的话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多