自我引用的儿童没有附加

时间:2017-12-27 12:17:29

标签: symfony doctrine-orm lazy-loading

我有一个这样的家谱:

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

我看到的查询和家人一样多。

我怎样才能让孩子在父母身边得到依恋? (没有更多疑问)

我忘了什么?

2 个答案:

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

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