Doctrine LAZY模式不会减少Symfony2中的查询

时间:2015-09-29 13:03:30

标签: php entity-framework symfony doctrine-orm doctrine

我有一个实体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”,但没有任何变化。

你有什么想法吗?

由于

编辑:

DB schema

所以,这是我的数据库架构的解释。

我有一个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 %}

2 个答案:

答案 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();