qai*_*ais 4 one-to-many relationship self-reference symfony doctrine-orm
在我的"主题"实体中,我有一对多,自我引用的关系$parent:$children.
class Topic
{
/** @ORM\Id
* @Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/** @Column(length=40, unique=true) */
private $name;
/**
* @ORM\ManyToOne(targetEntity="Topic", inversedBy="children")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Topic", mappedBy="parent")
*/
private $children;
}
Run Code Online (Sandbox Code Playgroud)
我可以加入表来获得这样的父子层次结构:
return $this->getEntityManager()->createQuery('
SELECT t, c FROM My\xxxBundle\Entity\Topic t
LEFT JOIN t.children c
WHERE t.parent IS NULL
')
->getArrayResult();
Run Code Online (Sandbox Code Playgroud)
这是正确的输出:
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
...
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试在SELECT语句中获取特定的列:
SELECT t.name, c.name FROM My\xxxBundle\Entity\Topic 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)
Run Code Online (Sandbox Code Playgroud)
在Mark的建议中,我重命名了子实体的名称字段:
SELECT t.name, c.name AS child_name FROM My\xxxBundle\Entity\Topic t
Run Code Online (Sandbox Code Playgroud)
但我仍然得到错误的格式:
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'
Run Code Online (Sandbox Code Playgroud)
问题是您选择了两个具有相同名称的字段(主题中的名称字段和子项中的名称字段).创建数组键时,这些名称会相互冲突.解决此问题的方法是重命名其中一个字段:
SELECT t.name, c.name AS child_name FROM My\xxxBundle\Entity\Topic t
Run Code Online (Sandbox Code Playgroud)
获得平面数组的原因是因为您没有选择实体,而是从这些实体中选择单个值.
更多信息请参见该DQL文件: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#select-queries
编辑 从查询中获得的当前结果是合乎逻辑的.它与您运行等效SQL查询时所获得的匹配.您当前正在做的是从两个数据库表中获取两个值.你真正想要的是在数组中格式化的两个部分实体.
您可以尝试使用Partials.这是一种在学说中选择实体的几个字段的方式.你把它与 - > getArrayResult()结合起来,你可能会得到正确的输出
return $this->getEntityManager()->createQuery('
SELECT partial t.{name}, partial c.{name}
FROM My\xxxBundle\Entity\Topic t
LEFT JOIN t.children c
WHERE t.parent IS NULL
')
->getArrayResult();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11917 次 |
| 最近记录: |