我有一个这样的家谱:
class Family
{
/**
* @var integer
*
* @ORM\Column(type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var Family
*
* @ORM\ManyToOne(targetEntity="Family", inversedBy="children")
*/
private $parent;
/**
* @var string
*
* @ORM\Column(name="name", type="string")
*/
private $name;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Family", mappedBy="parent")
*/
private $children;
// [...]
}
我试图findAll()
并让父母和子女附上
$familyRepo = $this->em->getRepository(Family::class);
$families = $familyRepo->findAll();
foreach ($families as $family) {
dump($family->getParent()->getName());
}
我可以看到转储的父名称,只执行了一个查询,因此它们很好地附加。
但是,如果我试图向孩子们展示:
dump($family->getChildren()->count());
我看到的查询和家人一样多。
我怎样才能让孩子在父母身边得到依恋? (没有更多疑问)
我忘了什么?
答案 0 :(得分:0)
在$children
的一对多关系上,您可以指定如下抓取对象:
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Family", mappedBy="parent", fetch="EAGER")
*/
private $children;
另见docs其他参数。
答案 1 :(得分:0)
按照@ dlondero的建议,我强行深入了解存储库。
我是这样做的:
public function getRootNodes($eagerLevels = 5)
{
$qb = $this->createQueryBuilder('entity0')
->select('partial entity0.{id, name, parent}')
->where('entity0.parent IS NULL')
;
for ($i = 0; $i < $eagerLevels; $i++) {
$qb
->leftJoin('entity'.$i.'.children', 'entity'.($i+1))
->addSelect('partial entity'.($i+1).'.{id, name, parent}')
;
}
return $qb->getQuery()->getResult();
}
这部分取得了我所需要的,所以不会发生延迟加载 我还使深度级别可配置。