2011-03-18 60 views
0

我已經建立了一個自引用實體每這裏的手冊:學說2自引用的實體將不會返回父ID

http://www.google.com/url?sa=D&q=http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html%23one-to-many-self-referencing

我的班級頁面(而不是類別,如在文檔中)。在我的實體 類中我有一個toArray()方法,我已經實現了這個方法,它會給我返回我的成員變量的值。對於那些屬於 關聯的字段,我已經確保抓取關聯的類對象,然後 獲取該ID。我正在這樣做填充表單。這裏是我的Page實體中的 my toArray()方法的代碼,以及我的PageService功能來抓取Page對象和我的Page Controller代碼,它們調用 toArray()來填充我的表單。

http://pastie.org/1686419

正如我在代碼中的註釋說,當指定者()方法 叫做頁面控制器,所有值獲取填充除了父ID。 page_type也是一個ManyToOne關聯,它得到填充沒有 問題。 toArray()方法之外的頁面對象 (頁面控制器)中顯式獲取父ID將返回 父id值。 (見代碼)

作爲一個方面說明,我在我的Page實體中使用了__get()和__set(),而不是完整的getter/setter。

+0

我剛剛發現,如果我直接實現getId()getter並在我的toArray()方法中使用它,它將返回id值。爲什麼,這是個問題。爲什麼它在toArray()方法之外(在我的控制器中)直接獲取值(沒有完整的getter)? – 2011-03-18 19:25:46

回答

0

不確定究竟是什麼導致了您描述的行爲,但無論如何,讓您的toArray()方法調用getters/setters而不是讓toArray()直接在類屬性上操作,可能會更好。這會給你一致性,所以如果你爲某些屬性實現自定義getter,你總是會從toArray()和getter獲得相同的結果。

一個粗略的例子:

<?php 
/** @Entity */ 
class MyEntity { 

    // .... 

    /** @Column */ 
    protected $foo; 


    public function setFoo($val) 
    { 
     $this->foo = $val; 
    } 

    public function getFoo() 
    { 
     return 'hello ' . $this->foo; 
    } 

    public function toArray() 
    { 
     $fields = array('foo'); 
     $values = array(); 
     foreach($fields as $field) { 
      $method = 'get' . ucfirst($field); 
      if (is_callable(array($this, $method)) { 
       $fields[$field] = $this->$method(); 
      } else { 
       $fields[$field] = $this->$field; 
      } 
     } 
     return $fields; 
    } 
} 

現在你會得到相同的結果:

<?php 
$e = new MyEntity; 
$e->setFoo('world'); 
$e->getFoo(); // returns 'hello world' 
$e->toArray(); // returns array('foo' => 'hello world') 
1

我想這是因爲你正在通過代理抓了出來。當在Doctrine 2中有一個關聯時,相關對象不會直接作爲對象返回,而是作爲直到調用方法(由於延遲加載才能保存數據庫查詢)纔會填充其屬性的子類。

由於您直接調用屬性(使用$ this-> parent-> id)而不調用任何方法,因此對象屬性全部爲空。

此頁面http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/getting-started-xml-edition.html#a-first-prototype在警告框中有關於此類事件的警告。儘管你的公共屬性不是公共屬性,但是你可以像訪問對象屬於同一個類一樣訪問同樣的問題。

+0

我正在使用__get()和__set()方法,它們允許您像訪問對象一樣公開訪問對象屬性。我用同樣的方法從同一類的另一個關聯(page_type)中檢索id,並且它工作正常。問題與這個特定的關聯直接相關,我覺得它必須與事實有關,因爲它是對相同類型實體的引用。另外,正如我上面提到的,我可以直接調用我的toArray()方法之外的父id,並且它可以工作。它僅在toArray()方法內纔會檢索值。 – 2011-03-29 13:31:30

+0

__get和__set僅適用於不可訪問的屬性。因爲它屬於同一個班級,所以它們可以訪問,所以它只是直接訪問私有屬性。但是因爲沒有函數被調用,代理還沒有被加載,所以所有的值都是空的。 – Gnuffo1 2011-03-29 15:44:34

+0

好的,我明白你現在在說什麼。然而,問題只發生在這個值,即使在我的toArray()方法中。我可以直接訪問我的toArray()方法中的page_type id,沒有任何問題。 'page_type'=> $ this-> page_type-> id據我可以告訴我沒有任何其他代碼在我的toArray()調用之前,這將加載代理page_type的值。 – 2011-04-05 15:46:37