我有一个这样的家谱:
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());
我看到的问题和家人一样多。
我怎样才能像父母一样抚养孩子? (没有更多的问题)
我忘记了什么?
在$children
的一对多关系上,您可以指定如下抓取对象:
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Family", mappedBy="parent", fetch="EAGER")
*/
private $children;
另见其他参数的docs。
按照@ 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();
}
这部分取得了我所需要的,所以不会发生延迟加载。 我还使深度级别可配置。