我对Doctrine查询为何以某种方式工作有点困惑。假设我们有文章和用户实体,其中用户与文章具有OneToMany关系。
然后,在控制器中我们将获得所有文章并将它们发送到视图。
"src" @@ "/home/projects/something" returns "src/home/projects/something"
"src" </> "/home/projects/something" returns "/home/projects/something"
在视图中我们会循环它们。
$em = $this->getEntityManager();
$articles = $em->getRepository('MyBundle:Article')->findAll();
这里的问题是这段代码为每个单篇文章做了一个额外的查询(针对文章的用户)。
我知道我们可以使用DQL,但我的问题是Doctrine如何在这里工作,为什么不针对这种事情进行优化,这很常见?我发现这是应用程序常用的“错误”,这真的会减慢它们的速度。我刚刚发现了这个,现在我必须在控制器中重写这么多查询。
这也违背了ORM的目的,它实际上应该提供编写应用程序的速度。这迫使我们编写DQL / QB查询而不是利用ORM。那么,如果ORM表现如此糟糕,ORM何时才是好主意?
答案 0 :(得分:2)
我知道我们可以使用DQL,但我的问题是Doctrine如何在这里工作,为什么它没有针对这种事情进行优化,这很常见?
Doctrine无法猜出Twig视图中需要的值。
但是当我调用相关实体时,为什么它不会在视图中创建查询?为什么要创建单独的查询?
这可能不是解决方案。见代码:
{% for article in articles %}
{{ article.author.name }}
{% endfor %}
要知道你必须显示什么值,Symfony应该迭代循环以猜测你需要什么值,这在获取数据之前会有很多工作。
您可以明确告知Doctrine应该向查询添加哪些表关联:
在ArticleRepository
repository中,您必须join相关表格:
<?php
namespace Acme\Bundle\AcmeBundle\Entity;
use Doctrine\ORM\EntityRepository;
class ArticleRepository extends EntityRepository
{
public function getArticlesWithAuthors()
{
$qb = $this->createQueryBuilder('article');
$query = $qb
->select('article, author')
->innerJoin('article.author', 'author')
->orderBy('a.id', 'DESC')
;
return $query->getQuery()->getResult();
}
}
然后你可以调用方法:
$articles = $em->getRepository('MyBundle:Article')->getArticlesWithAuthors();
Doctrine将在同一查询中加载与文章相关联的作者。