代码之家  ›  专栏  ›  技术社区  ›  Sangit

获得选择无所有关联实体的原则

  •  1
  • Sangit  · 技术社区  · 8 年前

    我的用户实体有几个关联

        oneToMany:
        images:
            targetEntity: Image
            mappedBy: user
        posts:
            targetEntity: Post
            mappedBy: user
            fetch: EXTRA_LAZY
        postcomments:
            targetEntity: Postcomment
            mappedBy: user
            fetch: EXTRA_LAZY
    

    我想选择一个具有所有帖子和图像的特定用户,而不是他的帖子评论。这是我使用的查询:

            $qb = $em->createQueryBuilder()
            ->select(array('u', 'p', 'i'))
            ->from('AppBundle:User', 'u')
            ->leftJoin('u.posts', 'p')
            ->leftJoin('u.images', 'i')
            ->where('u.id = :id')
            ->setParameter('id', $id);
    

    然而,返回的结果也包含所有其他关联。就像我只选择u并删除连接一样。

    如何选择结果中的特定关联?

    下面是api调用的完整代码

     public function getAction($id)
     {
        $em = $this->getDoctrine()->getEntityManager();
    
        $qb = $em->createQueryBuilder()
            ->select(array('u', 'p', 'i'))
            ->from('AppBundle:User', 'u')
            ->leftJoin('u.posts', 'p')
            ->leftJoin('u.images', 'i')
            ->where('u.id = :id')
            ->setParameter('id', $id)
            ->getQuery();
    
        $users = $db->getOneOrNullResult();
        $view = $this->view($users);
    
        return $this->handleView($view);
    }`
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Jakub Matczak    8 年前

    我认为你被Doctrine的惰性加载特性误导了。

    $user->getPostcomments();
    

    它会返回 Postcomment s、 但这并不意味着它已经和用户本身一起从数据库中获取。

    这里发生了延迟加载。这意味着它是在首次尝试访问此集合时加载的。除非你使用它,否则它不会真正牵强。;-)

    默认情况下,Doctrine集合 fetch: LAZY 工作方式如上所述。你用过 EXTRA_LAZY slice() 它使用的方法。这有时很有用,但有时可能会导致性能问题。你应该意识到 LAZY 额外_ AZY .