问题描述
考虑此类:
class Person {
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Person",fetch="EXTRA_LAZY")
* @ORM\OrderBy({"name" = "ASC"})
*/
public $friends;
/**
*
* @var Person
* @ORM\ManyToOne(targetEntity="Person")
*/
public $bestFriend;
}
我必须对所有人员进行大量迭代,因此我想一次将所有人员加入。 为了节省内存,我必须部分地这样做。
所以我能做的是:
$this->em->createquery('SELECT partial p.{id,name,bestFriend} FROM Person p')->getResult();
这很酷,在此查询之后,所有人员都在UoW中,并且由于所有人员都在内存中,因此我可以通过$aPersion->bestFriend->bestFriend
遍历图形而无需向数据库创建附加查询。
但是,这不适用于ToMany关联。将friends
添加到部分选择会产生错误。如果要遍历所有朋友,这将首先创建对联接表的查询...
如何通过一个查询实现friends
-ToMany关联的完全水合?也许第二个查询可以帮助?还是一个聪明的连接子句?
谢谢!
解决方法
我会在leftJoin
中使用addSelect
和$qb = $this->em->getRepository('App:Person')
->createQueryBuilder('p')
->leftJoin('p.friends','friends')
->select('partial p.{id,name,bestFriend}'}
->addSelect('partial friends.{id,name}') // Retrieve what you want here
->getQuery()->getResult();
return $qb;
创建查询,如下所示:
iso3c
我还没有测试过,但是相信它可以工作。
,@DirkJFaber您的答案是正确的,
关于DQL,这是我的解决方案:
$this->em->createQuery('
SELECT partial p.{id,bestFriend},f FROM Person p JOIN f.friends f')->getResult();