获得学说以选择没有所有关联的实体

时间:2016-08-28 22:33:10

标签: symfony orm doctrine-orm doctrine dql

我的用户实体有几个关联

    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);

但是返回的结果还包含所有其他关联。就像我只选择你并删除连接一样。

如何只选择结果中的某些关联?

以下是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 个答案:

答案 0 :(得分:1)

我认为你被Doctrine的延迟加载功能误导了。

当你这样做时

$user->getPostcomments();

它会返回Postcomment的集合,但这并不意味着它已经与用户自己一起从DB中获取。

延迟加载发生在这里。这意味着它是在第一次访问此集合时加载的。直到你使用它才真正取出它。 ; - )

默认情况下,Doctrine设置fetch: LAZY模式,如上所述。您使用了EXTRA_LAZY,其中包含一些其他功能。在这种情况下,当您尝试访问集合(或切片)的特定元素时,Doctrine仍然不会加载整个集合,而只会加载请求的元素或子集(如果使用slice()方法。这有时是有用的,但有时可能是性能问题的原因。您应该了解LAZYEXTRA_LAZY之间的区别。