[英]One-To-Many DB tables rellation with Doctrine2
我具有以下相關數據庫表的設置:
Organization
+--------+---------+
| id | integer |
+--------+---------+
| name | string |
+--------+---------+
Division
+---------------+---------+
| id | integer |
+--------+----------------+
|organization_id| integer |
+---------------+---------+
| name | string |
+---------------+---------+
Subdivision
+---------------+---------+
| id | integer |
+--------+----------------+
| division_id | integer |
+---------------+---------+
| name | string |
+---------------+---------+
我正在將Symfony2與Doctrine2 ORM和FOSRestBundle一起使用 。
現在,我對關聯映射感到困惑。
當我需要一個組織時,我想獲得以下內容
{
id: 1,
name: "organization1",
divisions: [
{
id: 1,
organization_id: 1,
name: "division1"
subdivisions: [
{
id: 1,
division_id: 1,
name: "subdivision1"
}
]
}
]
}
我弄清楚了這一點,並使用了Doctrine的一對多雙向關聯映射 。
使我頭疼的是這種關系的相反方向。 如果我需要特定的細分,我希望獲得以下信息:
{
id: 1,
division_id: 1,
name: "subdivision1",
division: {
id: 1,
organization_id: 1,
name: "division1"
organization: {
id: 1,
name: "organization"
}
}
]
}
但是我得到這個:
{
id: 1,
division_id: 1,
name: "subdivision1",
division: {
id: 1,
organization_id: 1,
name: "division1",
organization: {
id: 1,
name: "organization1",
divisions: [/* ..list of all the other divisions.. */]
},
subdivisions: [/* ..list of all the other subdivisions.. */]
}
}
如何使用Doctrine從返回的數據中刪除細分和細分?
因為我只需要細分,它所屬的部門和該部門所屬的組織。 列出所有樹會占用大量數據和時間,而我並不需要全部。
編輯:
我正在使用以下內容來檢索記錄(一切都按預期進行):
$organization = $this
->getDoctrine()
->getRepository('MyTestBundle:Organization')
->find($id);
$organization = $this
->getDoctrine()
->getRepository('MyTestBundle:Organization')
->findAll();
而相反的方向:
$subdivision = $this
->getDoctrine()
->getRepository('MyTestBundle:Subdivision')
->find($id);
這將生成以下SQL:
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.id = ? ["11"] []
SELECT t0.id AS id1, t0.organization_id AS organization_id2, t0.name AS name3, t0.organization_id AS organization_id4 FROM Division t0 WHERE t0.id = ? [16] []
SELECT t0.id AS id1, t0.name AS name2 FROM Organization t0 WHERE t0.id = ? [15] []
SELECT t0.id AS id1, t0.organization_id AS organization_id2, t0.name AS name3, t0.organization_id AS organization_id4 FROM Division t0 WHERE t0.organization_id = ? [15] []
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.division_id = ? [15] []
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.division_id = ? [18] []
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.division_id = ? [19] []
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.division_id = ? [45] []
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.division_id = ? [49] []
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.division_id = ? [51] []
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.division_id = ? [56] []
SELECT t0.id AS id1, t0.division_id AS division_id2, t0.name AS name3, t0.division_id AS division_id4 FROM Subdivision t0 WHERE t0.division_id = ? [16] []
將$subdivision ... ->find($id)
替換為
$subdivision = $this
->getDoctrine()
->getRepository('MyTestBundle:Subdivision')
->createQueryBuilder('s')
->leftJoin('s.division', 'd')
->leftJoin('d.organization', 'o')
->where('s.id = :id')
->setParameter('id', $id)
->getQuery()
->getSingleResult();
這應該已經減少了Doctrine提出的請求數量。 當然, organization
的divisions
屬性將仍然存在,但是內容不會隨第一個查詢自動加載。 如果您通過getDivisions()
訪問該屬性,則將從數據庫中加載內容。 Doctrine的一項功能是無需開發人員就可以加載必要的數據。 當然,這並不是最有效的方式,您必須根據需要采用這種方式。 看看延遲加載和相關主題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.