2012-09-24 120 views
3

在我的'主題'實體中,我有一對多自引用關係$parent:$childrenDoctrine2一對多,自我引用關係

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。如果父母有沒有孩子,我只是得到了它的名字空值:

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) 

馬克的建議,我已經改名爲孩子實體的名稱字段:

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' 

回答

5

的問題是,選擇具有相同名稱(從主題名稱字段,並從孩子的名字字段)兩個字段。這些名稱在創建數組鍵時相互衝突。這個問題的解決方案是通過重命名其中一個字段:

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(); 
+0

我仍然得到錯誤的數組格式。我編輯了我的問題以添加更多結果 – qais

+1

嘗試按我在編輯的答案中描述的部分 – Mark

+0

現在可以使用。謝謝馬克 – qais