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

Fetching all objects of one class with self-referencing ManyToMany

想想这个 class:

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 添加到部分 select 会产生错误。如果我想遍历所有朋友,这将首先创建一个查询到连接 table...

如何通过一个查询实现 friends-ToMany-assotiation 的完全水合?也许第二个查询会有所帮助?还是聪明的连接子句?

提前致谢!

我会在 PersonRepository.php 中创建一个带有 leftJoinaddSelect 的查询,如下所示:

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

我没有测试过这个,但相信它应该有效。

@DirkJFaber 你的回答是正确的,

就 DQL 而言,这是我的解决方案:

$this->em->createQuery('
    SELECT partial p.{id, name, bestFriend}, f FROM Person p JOIN f.friends f')->getResult();