我正在阅读Doctrine 2中关于懒惰关联的内容以及如何避免以下情况:
在文档中的paragraph中解释了如何为您的实体启用延迟关联。我想念我如何在我的实体库中使用它。
到目前为止,我尝试了对实体存储库的一些调整但没有任何成功。我还尝试了this post,this post和this 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 %}
答案 0 :(得分:0)
您无需执行任何特殊操作即可启用延迟加载。您显示的关系中的额外延迟加载对于新闻未加载作者不是必需的。它只是意味着您可以在不加载整个集合的情况下对集合进行调用,例如 - >包含。其他一些便利。
dump()应该在Author上显示一些内容:
protected 'author' =>
object(Proxies\__CG__\YourNamespace\YourBundle\Entity\Author)
这并不意味着已从db中获取实体。引用the docs。
而不是传回一个真正的作者实例和一个集合 注释Doctrine将为您创建代理实例。只有你 他们第一次访问这些代理时会访问这些代理 EntityManager并从数据库加载它们的状态。
如果您没有返回代理类,可能是因为您之前已经在代码中访问过该关系。或者您已在查询中明确获取该实体。