向 select 个没有所有关联的实体获取学说
get doctrine to select entities without all associations
我的用户实体有几个关联
oneToMany:
images:
targetEntity: Image
mappedBy: user
posts:
targetEntity: Post
mappedBy: user
fetch: EXTRA_LAZY
postcomments:
targetEntity: Postcomment
mappedBy: user
fetch: EXTRA_LAZY
我想 select 一个特定用户的所有帖子和图片,但不是他的评论。这是我使用的查询:
$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);
然而,返回的结果也包含所有其他关联。就像我只是 select u 并删除连接一样。
如何才能 select 只有某些关联出现在结果中?
这是 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);
}`
我认为你被 Doctrine 的延迟加载功能误导了。
当你
$user->getPostcomments();
而且它 returns 你是 Postcomment
的集合,它仍然不意味着它已经与用户本身一起从数据库中获取。
懒加载发生在这里。这意味着它会在第一次尝试访问此集合时加载。在您使用它之前,它并没有真正被获取。 ;-)
默认情况下,Doctrine 设置 fetch: LAZY
模式,其工作方式如上所述。您已经使用了具有一些附加功能的 EXTRA_LAZY
。在这种情况下,当您尝试访问集合的特定元素(或切片)时,Doctrine 仍然不会加载整个集合,但如果它使用 slice()
方法,则只会加载请求的元素或子集。这有时很有用,但有时可能会导致性能问题。你应该知道 LAZY
和 EXTRA_LAZY
之间的区别。
我的用户实体有几个关联
oneToMany:
images:
targetEntity: Image
mappedBy: user
posts:
targetEntity: Post
mappedBy: user
fetch: EXTRA_LAZY
postcomments:
targetEntity: Postcomment
mappedBy: user
fetch: EXTRA_LAZY
我想 select 一个特定用户的所有帖子和图片,但不是他的评论。这是我使用的查询:
$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);
然而,返回的结果也包含所有其他关联。就像我只是 select u 并删除连接一样。
如何才能 select 只有某些关联出现在结果中?
这是 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);
}`
我认为你被 Doctrine 的延迟加载功能误导了。
当你
$user->getPostcomments();
而且它 returns 你是 Postcomment
的集合,它仍然不意味着它已经与用户本身一起从数据库中获取。
懒加载发生在这里。这意味着它会在第一次尝试访问此集合时加载。在您使用它之前,它并没有真正被获取。 ;-)
默认情况下,Doctrine 设置 fetch: LAZY
模式,其工作方式如上所述。您已经使用了具有一些附加功能的 EXTRA_LAZY
。在这种情况下,当您尝试访问集合的特定元素(或切片)时,Doctrine 仍然不会加载整个集合,但如果它使用 slice()
方法,则只会加载请求的元素或子集。这有时很有用,但有时可能会导致性能问题。你应该知道 LAZY
和 EXTRA_LAZY
之间的区别。