使用自引用 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
中创建一个带有 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;
我没有测试过这个,但相信它应该有效。
@DirkJFaber 你的回答是正确的,
就 DQL 而言,这是我的解决方案:
$this->em->createQuery('
SELECT partial p.{id, name, bestFriend}, f FROM Person p JOIN f.friends f')->getResult();
想想这个 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
中创建一个带有 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;
我没有测试过这个,但相信它应该有效。
@DirkJFaber 你的回答是正确的,
就 DQL 而言,这是我的解决方案:
$this->em->createQuery('
SELECT partial p.{id, name, bestFriend}, f FROM Person p JOIN f.friends f')->getResult();