【发布时间】:2016-01-22 20:38:15
【问题描述】:
我有点困惑为什么 Doctrine 查询以这种特定方式工作。假设我们有 Articles 和 Users 实体,Users 与 Articles 具有 OneToMany 关系。
然后,在控制器中,我们将获取所有文章并将它们发送到视图。
$em = $this->getEntityManager();
$articles = $em->getRepository('MyBundle:Article')->findAll();
在视图中我们会循环它们。
{% for article in articles %}
{{ article.author.name }}
{% endfor %}
这里的问题是这段代码对每一篇文章都做了一个额外的查询(针对文章的用户)。
我知道我们可以使用 DQL,但我的问题是 Doctrine 在这里是如何工作的,为什么它不针对这种很常见的事情进行优化?我发现这是应用程序中常用的“错误”,这确实会减慢它们的速度。我刚刚发现了这一点,现在我必须将这么多查询重写到我的控制器中。
这也违背了 ORM 的目的,它实际上应该提供编写应用程序的速度。这迫使我们编写 DQL/QB 查询而不是利用 ORM。那么,如果 ORM 表现如此糟糕,什么时候使用它是个好主意?
【问题讨论】:
-
查看 eager 和 lazy fetching,你就会开始明白了。
-
Eager fetch 的问题是它总是会获取相关实体,即使它们不需要。
-
@GeorgeIrimiciuc 这就是权衡。要么您总是获取相关实体以预期对其进行迭代,要么您不这样做,并且在需要时检索它们。 ORM 自己无法知道您将如何使用相关实体,您需要告诉它。
-
但是当我调用相关实体时,它为什么不在视图中创建查询?为什么要创建单独的查询?
标签: php symfony doctrine-orm