自我引用的儿童没有附加

问题描述 投票:0回答:2

我有一个这样的家谱:

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

我看到的问题和家人一样多。

我怎样才能像父母一样抚养孩子? (没有更多的问题)

我忘记了什么?

symfony doctrine-orm lazy-loading
2个回答
0
投票

$children的一对多关系上,您可以指定如下抓取对象:

/**
 * @var ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="Family", mappedBy="parent", fetch="EAGER")
 */
private $children;

另见其他参数的docs


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

这部分取得了我所需要的,所以不会发生延迟加载。 我还使深度级别可配置。

© www.soinside.com 2019 - 2024. All rights reserved.