访问对象时的其他数据库请求与twig模板相关

时间:2014-11-17 18:05:49

标签: php symfony doctrine-orm twig

当我写这样的东西时:

控制器:

public function listAction() {
    $actions = $this->getDoctrine()->getRepository('AcmeDemoBundle:Action')->findAll();

    return $this->render('AcmeDemoBundle:Admin:action/list.html.twig', 
            array('actions' => $actions));    
}

树枝模板:

        {% for action in actions %}
          ..........
            {% for descr in action.term.description %}
                <dd class="l-margin">{{ descr.text }}</dd>
            {% endfor %}

每次我访问术语时,描述,调试工具栏都会显示我向数据库发出请求,获取每个术语或其他关系。当我在控制器中访问它们时,没有这个数据库请求。

当我写这样更详细的dql查询时:

    $qb->select('action, term, descr')
        ->from('AcmeDemoBundle:Action', 'action')
        ->join('action.term', 'term');
        ->join('term.description', 'descr');

所有其他请求都会消失。一定是这样吗?

2 个答案:

答案 0 :(得分:1)

您在TWIG中看到所有这些查询的原因是您在请求action.term时正在访问这些查询。 Doctrine为您添加了这些查询。使用联接时,会在一个查询中请求它们。这在此处记录 - http://symfony.com/doc/current/book/doctrine.html#joining-related-records。建议使用联接以避免额外查询。

答案 1 :(得分:1)

它是什么;表示在TWIG文件或控制器中,如果从查询结果中调用相关对象,则对象未添加到您的选择中将获取数据库查询。 e.g:

$actions = $this->getDoctrine()->getRepository('AcmeDemoBundle:Action')->findAll();
foreach ($actions as $action) {
   print $action->getTerm()->getDescription();
   ...
}

在同一顶级查询的枝条中也是如此:

{% for action in actions %}
     <dd class="l-margin">{{ action.getTerm.getDescription }}</dd>

这些顶级示例将触发数据库查询,因为相关实体未添加到选择中。 选择查询中添加相关实体的相同选择将减少执行数据库查询的数量,但会导致选择连接的行和列取决于查询中使用的连接类型,例如:

$result = $em->createQueryBuilder('A')
   ->addSelect('A.term')
   ->join('A.term', 'T')
   ->getQuery()
   ->getResult();

现在,无论是在控制器中还是在TWIG文件中,如果您致电$action->getTerm()->getDescription(){{ action.getTerm.getDescription }},它都不会执行单独的数据库查询,因为它在您构建查询时已添加到您的选择中。 / p>