2012-08-13 45 views
0

Doctrine2 似乎正在爲其代理對象添加魔法來實現延遲加載。這使我的結果不正確,我無法弄清楚是什麼原因造成的。Doctrine2代理getId魔法?

這裏是我的類模型:

類 「RedProduct」 從抽象類 「產品」,它實現了接口 「BaseProduct」

抽象類產品持有主鍵繼承:

abstract class Product implements BaseProduct { 
    /** @Id @Column (type="integer", name="ID") @GeneratedValue */ 
    protected $id; 

    public function getId() {  
     return $this->id;   
    }        
} 

我希望RedProduct在返回之前將ID前面加上字母'R'。

class RedProduct extends Product { 
    public function getId() { 
     return 'R' . $this->id; 
    } 
} 

但在代理類中,getId()方法(也是唯一的getId()方法)已被修改爲這樣:

public function getId() 
{ 
    if ($this->__isInitialized__ === false) { 
     return $this->_identifier["id"]; 
    } 
    $this->__load(); 
    return parent::getId(); 
} 

這意味着我的對象不返回正確的當它沒有被初始化時

「getId」是Doctrine2的保留還是魔術方法?當我在基類和繼承類中創建其他方法時,它在代理上沒有這種效果。

回答

-1

如果檢查getId()方法的代理,你會看到它有這樣一行:

return parent::getId(); 

這意味着它會叫你的模型類中定義的的getId()函數(RedProduct) ,因爲所有的代理擴展了相應的模型。問題在於別處。

我不確定你試圖通過修改模型返回的id來達到什麼目的,但是當持久化實體持久化時,Doctrine不會調用你的getters,它使用反射,所以如果問題是你的id不正確數據庫,這可能是原因。

+0

謝謝你的迴應。你是對的,除了當對象沒有被初始化的時候,這種情況下,當產品對象是一個ProductReview對象時,RedProduct對象是一個延遲加載的關聯引用。從代理方法來看,如果對象沒有初始化,它只是返回主鍵。我的問題依然存在 - getId()是否有特殊情況? – iamdev 2012-08-16 00:40:52

+0

我應該補充說,如果我調用$ review-> getProduct() - > getName();首先,然後我調用$ review-> getProduct() - > getId();它是正確的,因爲getName()強制產品對象爲「load()」 – iamdev 2012-08-16 00:45:40

+0

不,getId()不是保留方法或任何東西就像我所知道的那樣。 – 2012-08-16 13:07:52