教义2一对多,自我参照的关系



在我的"主题"实体中,我有一个一对多的自引用关系$parent:$children

class Topic
{
/** @ORMId 
* @Column(type="integer")
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/** @Column(length=40, unique=true) */
private $name;
/**
* @ORMManyToOne(targetEntity="Topic", inversedBy="children")
*/
private $parent;
/**
* @ORMOneToMany(targetEntity="Topic", mappedBy="parent")
*/
private $children;
}

我可以加入表来获得父子层次结构,如下所示:

return $this->getEntityManager()->createQuery('
SELECT t, c FROM MyxxxBundleEntityTopic t 
LEFT JOIN t.children c
WHERE t.parent IS NULL
')
->getArrayResult();

以下是正确的输出:

array
0 => 
array
'id' => int 1
'name' => string 'Parent 1'
'slug' => string 'p-1'
'description' => null
'children' => 
array
0 => 
array
'id' => int 2
'name' => string 'Child 1-1'
'slug' => string 'c-1-1'
'description' => null
1 => 
array
'id' => int 3
'name' => string 'Child 1-2'
'slug' => string 'c-1-2'
'description' => null
1 => 
array
'id' => int 4
'name' => string 'Parent 2'
'slug' => string 'p-2'
'description' => null
'children' => 
array
empty
...

但是如果我尝试在SELECT语句中获取特定列:

SELECT t.name, c.name FROM MyxxxBundleEntityTopic t

我得到一个平面的子实体数组,即只有c.name。如果一个父母没有孩子,我只会为它的名字得到一个空值:

1 => 
array (size=1)
'name' => string 'Child 1-1' (length=14)
2 => 
array (size=1)
'name' => string 'Child 1-2' (length=14)
3 => 
array (size=1)
'name' => null
4 => 
array (size=1)
'name' => string 'Child 3-1' (length=5)

根据Mark的建议,我将子实体的名称字段重命名为:

SELECT t.name, c.name AS child_name FROM MyxxxBundleEntityTopic t

但我仍然得到错误的格式:

array
0 => 
array
'name' => string 'Parent 1'
'child_name' => string 'Child 1-1'
1 => 
array
'name' => string 'Parent 1'
'child_name' => string 'Child 1-2'
2 => 
array
'name' => string 'Parent 2'
'child_name' => string 'Child 2-1'

问题是您选择了两个具有相同名称的字段(名称字段来自主题,名称字段来自子字段)。创建数组键时,这些名称相互冲突。这个问题的解决方案是重命名其中一个字段:

SELECT t.name, c.name AS child_name FROM MyxxxBundleEntityTopic t

获得平面阵列的原因是,您不是在选择实体,而是从这些实体中选择单个值。

有关更多信息,请参阅DQL文档:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#select-查询

编辑您从查询中获得的当前结果符合逻辑。它与运行等效SQL查询时得到的结果相匹配。您当前正在做的是从两个数据库表中获取两个值。您真正想要的是在数组中格式化的两个分部实体。

你可以尝试使用Partials。这是一种在学说中只选择一个实体的几个领域的方法。如果你将其与->getArrayResult()相结合,你可能会得到正确的输出

return $this->getEntityManager()->createQuery('
SELECT partial t.{name}, partial c.{name}
FROM MyxxxBundleEntityTopic t 
LEFT JOIN t.children c
WHERE t.parent IS NULL
')
->getArrayResult();

相关内容

  • 没有找到相关文章

最新更新