Doctrine2懒惰加载

时间:2015-06-23 19:34:51

标签: php symfony doctrine-orm doctrine entities

我正在阅读Doctrine 2中关于懒惰关联的内容以及如何避免以下情况:

Entity dump in twig template

在文档中的paragraph中解释了如何为您的实体启用延迟关联。我想念我如何在我的实体库中使用它。

到目前为止,我尝试了对实体存储库的一些调整但没有任何成功。我还尝试了this postthis postthis post,但他们似乎处理了ManyToMany或其他完整情况。

有人可以解释如何以及在何处使用延迟关联以避免上述示例?

由于篇幅较长,此代码段已删除不相关的私有属性和getter / setter。

的src /的appbundle /实体/ News.php

class News
{
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Account", fetch="EXTRA_LAZY")
     * @ORM\JoinColumn(name="author", referencedColumnName="id")
     */
    private $author;
}

的src /的appbundle /实体/存储库/ NewsRepository.php

class NewsRepository extends EntityRepository
{
    /**
     * @param $id
     * @return mixed
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    public function findOneById($id) {
        return $this->createQueryBuilder('a')
                    ->andWhere('a.id = :id')
                    ->setParameter('id', $id)
                    ->getQuery()
                    ->getOneOrNullResult();
    }
}

的src /的appbundle /控制器/ NewsController.php

/**
 * @Route("/{id}", name="news_item")
 * @Method({"GET"})
 * @Template("AppBundle:news:item.html.twig")
 */
public function articleAction(Request $request, $id)
{
    $news_item = $this->getDoctrine()->getRepository('AppBundle:News')->findOneById($id);

    if (!$news_item) {
        throw $this->createNotFoundException('No news item found by id ' . $id);
    }

    return array(
        'news_item' => $news_item
    );
}

的src /的appbundle /资源/视图/消息/ item.html.twig

{% extends 'base.html.twig' %}

{% block body %}
    {{ dump(news_item) }} }}
{% endblock %}

1 个答案:

答案 0 :(得分:0)

您无需执行任何特殊操作即可启用延迟加载。您显示的关系中的额外延迟加载对于新闻未加载作者不是必需的。它只是意味着您可以在不加载整个集合的情况下对集合进行调用,例如 - >包含。其他一些便利。

dump()应该在Author上显示一些内容:

protected 'author' => 
    object(Proxies\__CG__\YourNamespace\YourBundle\Entity\Author)

这并不意味着已从db中获取实体。引用the docs

  

而不是传回一个真正的作者实例和一个集合   注释Doctrine将为您创建代理实例。只有你   他们第一次访问这些代理时会访问这些代理   EntityManager并从数据库加载它们的状态。

如果您没有返回代理类,可能是因为您之前已经在代码中访问过该关系。或者您已在查询中明确获取该实体。