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

Posted

技术标签:

【中文标题】Doctrine2 自我参考查询——不起作用【英文标题】:Doctrine2 Self Reference Query -- Doesn't work 【发布时间】:2013-10-08 09:10:15 【问题描述】:

$我正在尝试使用学说 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 生成的自我关系

类树 /** * @var \树 * * @ORM\ManyToOne(targetEntity="Tree") * @ORM\JoinColumns( * @ORM\JoinColumn(name="parent_id", referencedColumnName="id") * ) */ 私人$父母; // 其他代码

这是我的回购类

_em->createQueryBuilder(); $qb->选择('p') ->从('实体\树','p') ->leftJoin('p.Entity\Tree','c', 'ON','p.id = c.parent_id'); 返回 $qb->getQuery()->getResult();

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

[2013 年 10 月 1 日星期二 22:30:11] [错误] [客户端 127.0.0.1] php 致命错误: 未捕获的异常'Doctrine\ORM\Query\QueryException' 消息'SELECT p FROM Entity\Tree p LEFT JOIN p.Entity\Tree c ON p.id = c.parent_id' 在 /var/www/pcb_frame_work/System/Libraries/Vendors/Doctrine/ORM/Query/QueryException.php:39\n堆栈 跟踪:\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 实体\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/Query/Parser.php(1435): Doctrine\ORM\Query\Parser->Join()\n#5 /var/www/pcb_frame_work/System/Librari 在 /var/www/pcb_frame_work/System/Libraries/Vendors/Doctrine/ORM/Query/QueryException.php 在第 49 行,引用:

【问题讨论】:

你能添加你的树实体的完整定义吗?也许这可以清楚地显示您在示例查询中使用的左右列 【参考方案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-&gt;children访问一个类的子类,用$Tree-&gt;parent访问它的父类。

更多关于自引用关联的信息可以在这里找到:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#one-to-many-self-referencing

【讨论】:

以上是关于Doctrine2 自我参考查询——不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用方法查找的教义2 oracle 查询,不起作用

zf2 + 学说 2 上的用户定义函数不起作用

多维动态数组,为啥不起作用?

UITableViewCell 样式字幕多行不起作用

Hibernate HQL Count Distinct 不起作用?

CSS类对齐自我结束不起作用