Doctrine orm 条令2无不必要查询的自引用实体

Doctrine orm 条令2无不必要查询的自引用实体,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,我试图让一个自引用实体在每次获取一个对象的子对象时停止查询数据库,并在一次查询中获取整个树 这是我的实体: /** * @ORM\Entity(repositoryClass="ExampleRep") * @ORM\Table(name="example_table") */ class Example { /** * @ORM\Id * @ORM\Column(type="integer", nullable=false); * @ORM\Gen

我试图让一个自引用实体在每次获取一个对象的子对象时停止查询数据库,并在一次查询中获取整个树

这是我的实体:

/**
 * @ORM\Entity(repositoryClass="ExampleRep")
 * @ORM\Table(name="example_table")
 */
class Example {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", nullable=false);
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Example", inversedBy="children")
     * @ORM\JoinColumn(name="parent", referencedColumnName="id", onDelete="SET NULL")
     */
    private $parent = null;

    /**
     * @ORM\OneToMany(targetEntity="Example", mappedBy="parent")
     */
    private $children;

}
我用queryBuilder给我的约会对象打电话,比如:

$query = $this->createQueryBuilder('e');
$query->orderBy('e.parent', 'ASC');
$example_data = $query->getQuery()->getResult();
当我循环使用示例_数据并调用getChildren时,会进行另一个查询,即使查询中已经调用了同一个对象

我在这里遵循了这个示例:但是当我这样做时,我的getChildren什么也不返回


有没有一种方法可以在不使用多个请求重载数据库的情况下获取我的数据?

如果您知道树的深度,只需执行自定义dql查询,然后执行以下操作:

return $this->createQueryBuilder('example')
    ->addSelect('children')
    ->leftJoin('example.children', 'children')
    ->addSelect('subChildren')
    ->leftJoin('children.children', 'subChildren')
;
否则,如前所述,您可以生成一个平面结果集,然后从中构造树

我使用物化路径进行了这种实现,但没有什么禁止您使用外键比较:


如果您知道树的深度,只需执行自定义dql查询和
addSelect('children')->leftJoin('example.children','children')->addSelect('subChildren')->leftJoin('children.children','subChildren')解决了我的问题。我在连接方面遇到了一些问题,缺少addSelect。按预期工作。是的,addSelect是这里的关键:它将连接的行添加到resultset,并要求Dority对相应的集合进行水合物化,这样就不需要进行延迟加载。