2011-08-06 142 views
2

的設置:學說2 OneToOne實體映射返回空實體

我有以下兩個代碼實體模型:

帳戶,代表用戶帳戶,並有一個外鍵教室。

<?php 
namespace models; 

/** 
* @Entity 
*/ 
class Account 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @OneToOne(targetEntity="Classroom") 
    */ 
    public $classroom; 
} 

課堂代表一個學生在enroled教室

<?php 
namespace models; 

/** 
* @Entity 
*/ 
class Classroom 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @Column(type="string") 
    */ 
    public $name; 
} 

問題:

當我做$account = $em->find('Account',$id);我正確地從數據庫中獲取的帳戶回來,但$account->classroom;是一個空的(非空)對象。試驗了一下後,我試着執行之前添加以下命令:

$em->getRepository('Classroom')->findAll(). 

然後我執行的$em->find('Account', $id);和教室對象中的帳戶對象正確返回。

猜測:

我認爲有什麼不對實體被加載並從數據庫緩存的方式,因爲如果我加載所有的教室對象(或與該帳戶我相關聯的一個)之前我做我的find(),然後一切都很好。

由於我是PHP和Doctrine的初學者,我尋求更多的意見/幫助來解決這個問題。

回答

4

Doctrine Architecture Documentation

任何實體類的所有持久屬性/字段應該總是私人保護,否則預期延遲加載可能無法正常工作。

$classroom屬性是public,這可能是爲什麼與課堂實體的關聯是不是被延遲加載。您應該將其更改爲privateprotected(我建議您將所有實體屬性protected,對於various reasons)。

如果不工作,你可以嘗試設置你的OneToOne協會EAGER的fetch屬性,即

/** 
* @OneToOne(targetEntity="Classroom", fetch="EAGER") 
*/ 
protected $classroom;