使用自引用ManyToMany获取一类的所有对象

问题描述

考虑此类:

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