我有一个实体Article
。在我的实体内部,我有一个字段articleComment
,已在article
实体中映射了一个字段ArticleComment
。
以下是代码:
class Article
{
/**
* @ORM\OneToOne(targetEntity="Project\MyBundle\Entity\ArticleComment", mappedBy="article", cascade={"persist"})
*/
private $articleComment;
// etc...
}
和
class ArticleComment
{
/**
* @ORM\OneToOne(targetEntity="Project\MyBundle\Entity\Article", inversedBy="articleComment")
* @ORM\JoinColumn(nullable=false)
*/
private $article;
// etc...
}
在特定页面中,我列出了每篇文章,但不需要字段articleComment。无论如何,Doctrine得到了所有的articleComment实体,我总共有75个查询。这太过分了!
所以,如果我必须在我的页面中使用它,我只是不想停止这种行为并获取articleComment实体。
我尝试了默认参数“LAZY
”,然后是“EXTRA_LAZY
”,最后是“EAGER
”,但没有任何变化。
你有什么想法吗?
由于
编辑:
所以,这是我的数据库架构的解释。
我有一个article_opinion表的存储库:
class ArticleOpinionRepository extends EntityRepository
{
public function getList() {
$db = $this->createQueryBuilder('ao')
->addSelect(array('a'))
->join('ao.article', 'a');
return $db->getQuery()->getResult();
}
}
每当Doctrine获得一篇包含该查询的文章时,附加到它的article_comment也会得到。因此,每个都会执行一个查询。
这是我在我的控制器中对存储库功能的调用:
public function getListArticlesAction() {
$articles = $this->getDoctrine()->getManager()->getRepository('MyBundle:ArticleOpinion')->getList();
return $this->render('MyBundle:Site:listArticle.html.twig', array('articles' => $articles));
}
我的树枝模板(用于测试):
{% block body %}
{% for a in articles %}
{{ a.id }}<br />
{% endfor %}
{% endblock %}
答案 0 :(得分:0)
我认为您在架构中正确地需要$ python3 par.py --arg a --arg b
0 options: Namespace(arg=None)
1 option: Namespace(arg=['a'])
2 options: Namespace(arg=['a', 'b'])
3 options: Namespace(arg=['a', 'b', 'c'])
Option --arg specified multiple times!
;您可以使用提示OneToOne
来避免延迟加载HINT_FORCE_PARTIAL_LOAD
实体:
OneToOne
注意:但是如果你需要它,你甚至不会得到你
$qb->getQuery()->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
的{{1}},因为它不会被加入...所以要格外小心
编辑:您也可以尝试使用数组进行水合,以强制延迟加载:
id
答案 1 :(得分:0)
我很确定这个问题不是关于你如何映射实体,而是关于你如何使用数据。
我认为懒惰模式有效,但不知何故,应用程序正在访问$ article-&gt; article_comment并且因为查询正在执行。
尝试删除(评论)应用程序的不同部分(可能是twig模板?)并找出您访问这些数据的位置。
BTW Extra Lazy模式与一对一的关系毫无意义。
UPD: 似乎在One-To-One关系中,Doctrine决定它必须加载由两个对象组成的整个实体。
要避免此行为,您必须提示部分加载正常
$query = $db->getQuery()->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)->getResult();