Doctrine相关实体的其他查询

时间:2016-01-22 20:38:15

标签: php symfony doctrine-orm

我对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何时才是好主意?

1 个答案:

答案 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将在同一查询中加载与文章相关联的作者。