我有自引用菜单实体(使用make:entity
创建:]:
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Menu", inversedBy="children")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Menu", mappedBy="parent")
*/
private $children;
和数据:
| id | name | parent |
|----|-----------|--------|
| 1 | MainItem | null |
| 2 | Child 1-1 | 1 |
| 3 | Child 1-2 | 1 |
| 4 | Child 1-3 | 1 |
我获得顶层菜单项的功能:
private function getTopMenu (MenuRepository $menuRepository) {
return $menuRepository->findBy(['parent' => null]);
}
返回以下内容:
array:1 [▼
0 => Menu^ {#1186 ▼
-id: 1
-name: "MainItem"
-parent: null
-children: PersistentCollection^ {#1188 ▼
-snapshot: []
-owner: Menu^ {#1186}
-association: array:15 [ …15]
-em: EntityManager^ {#1050 …11}
-backRefFieldName: "parent"
-typeClass: ClassMetadata {#1096 …}
-isDirty: false
#collection: ArrayCollection^ {#1189 ▼
-elements: []
}
#initialized: false
}
}
]
由于我的孩子没有任何东西,所以我尝试使用$menuRepository->find(2)->getParent();
向后工作,该返回的内容是:
Menu^ {#1205 ▼
+__isInitialized__: false
-id: 1
-name: null
-parent: null
-children: null
…2
}
最后我尝试了$menuRepository->find(2)->setParent($menuRepository->find(3))->getParent()
,但最终似乎使我到了某个地方:
Menu^ {#1201 ▼
-id: 3
-name: "Child 1-2"
-parent: Menu^ {#1205 ▶}
-children: PersistentCollection^ {#1200 ▶}
}
我不知道为什么getChildren
和getParent
没有返回数据。
从父母那里接触孩子应该起作用。相反也。
首先,请确保您的构造函数为孩子声明一个新的ArrayCollection。使用OneToMany关系时非常重要,因为Doctrine使用ArrayCollection正确加载子级数据。
use Doctrine\Common\Collections\ArrayCollection;
...
public function __construct(){
$this->children = new ArrayCollection();
}
如果仍然无法解决问题,我建议尝试更改实体映射的提取模式。
/**
* @ORM\OneToMany(targetEntity="App\Entity\Menu", mappedBy="parent", fetch="EAGER")
*/
private $children;
小心,急切的获取模式将在第一次数据库检索时加载整个阵列。通常,该学说将使用延迟加载,这会在使用get()方法时触发数据库调用。急切的获取模式可能很危险,因为在Eveytime时您将查询菜单,所有子级也将被加载,这可能会产生很大的开销。
希望这会有所帮助!