gpt4 book ai didi

symfony - Doctrine2一对多,自引用关系

转载 作者:行者123 更新时间:2023-12-05 00:33:07 25 4
gpt4 key购买 nike

在我的“主题”实体中,我具有一对多的自引用关系$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;
}

我可以加入表以获取父子层次结构,如下所示:
return $this->getEntityManager()->createQuery('
SELECT t, c FROM My\xxxBundle\Entity\Topic 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 My\xxxBundle\Entity\Topic t
我得到一个平面的子实体数组,即只有 c.name。如果 parent 没有 child ,我会得到一个空值的名字:
  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 My\xxxBundle\Entity\Topic 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 My\xxxBundle\Entity\Topic t

之所以获得平面数组,是因为您没有选择实体,而是选择了这些实体中的各个值。

有关更多信息,请参见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();

关于symfony - Doctrine2一对多,自引用关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12559132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com