簡體   English   中英

一對多DB表與Doctrine2的關系

[英]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提出的請求數量。 當然, organizationdivisions屬性將仍然存在,但是內容不會隨第一個查詢自動加載。 如果您通過getDivisions()訪問該屬性,則將從數據庫中加載內容。 Doctrine的一項功能是無需開發人員就可以加載必要的數據。 當然,這並不是最有效的方式,您必須根據需要采用這種方式。 看看延遲加載和相關主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM