首页 文章

Doctrine2自我参考查询 - 不起作用

提问于
浏览
0

$ 我正在尝试使用doctrine 2查询构建器创建以下场景

SELECT 
    p . *
FROM
    _tree p
    LEFT JOIN
    _tree c ON p.id = c.parent_id
       AND (c.lft >= p.lft AND c.rgt <= p.rgt)
WHERE
    p.id = 3

我已经设置了由Doctrine2自己生成的以下关系

class Tree {

    /**
     * @var \Tree
     *
     * @ORM\ManyToOne(targetEntity="Tree")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
     * })
     */
    private $parent;

      // other code
    }

这是我的回购课

_em->createQueryBuilder();
        $qb->select('p')
           ->from('Entity\Tree', 'p')
           ->leftJoin('p.Entity\Tree','c', 'ON','p.id = c.parent_id');

        return $qb->getQuery()->getResult();
    }
}

但我无法完成它 . 它会引发以下错误

[Tue Oct 01 22:30:11 2013] [error] [client 127.0.0.1] PHP致命错误:未捕获异常'Doctrine \ ORM \ Query \ QueryException',消息'SELECT p FROM Entity \ Tree p LEFT JOIN p . 实体\树c on p.id = c.parent_id'在/var/www/pcb_frame_work/System/Libraries/Vendors/Doctrine/ORM/Query/QueryException.php:39\nStack trace:\ n#0 / var / www /pcb_frame_work/System/Libraries/Vendors/Doctrine/ORM/Query/Parser.php(429):Doctrine \ ORM \ Query \ QueryException :: dqlError('SELECT p FROM E ...')\ n#1 / var / www / pcb_frame_work / System / Libraries / Vendors / Doctrine / ORM / Query / Parser.php(925):Doctrine \ ORM \ Query \ Parser-> semanticalError('Class Entity \ Ed ...')\ n#2 / var /www/pcb_frame_work/System/Libraries/Vendors/Doctrine/ORM/Query/Parser.php(1561):Doctrine \ ORM \ Query \ Parser-> JoinAssociationPathExpression()\ n#3 / var / www / pcb_frame_work / System / Libraries /Vendors/Doctrine/ORM/Query/Parser.php(1506):Doctrine \ ORM \ Query \ Parser-> JoinAssociationDeclaration()\ n#4 / var / www / pcb_frame_work / System / Libraries / Vendors / Doctrine / ORM / Quer y / Parser.php(1435):Doctrine \ ORM \ Query \ Parser-> Join()\ n#5 / var / www / pcb_frame_work / System / Librari in / var / www / pcb_frame_work / System / Libraries / Vendors / Doctrine第49行的/ORM/Query/QueryException.php,referer:

1 回答

  • 1

    我不知道我是否完全理解你,但我认为你必须改变你的ManyToOne关系:

    /**
     * @var \Tree
     *
     * @ORM\ManyToOne(targetEntity="Tree", inversedBy="children")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
     * })
     */
    private $parent;
    
    /**
     * @ORM\OneToMany(targetEntity="Tree", mappedBy="parent")
     */
    private $children;
    

    这样,您可以使用 $Tree->children 访问类的子级,并使用 $Tree->parent 访问它的父级 .

    有关自引用关联的更多信息,请访问:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#one-to-many-self-referencing

相关问题