2011-08-06 9 views
2

セットアップ:ドクトリン2 OneToOneエンティティマッピングは、空のエンティティを返す

I次のコード2つのエンティティのモデルがあります:

アカウント、ユーザーアカウントを表現し、教室への外部キーを持っています。

<?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;は、空の(nullでない)オブジェクトです。私は、実行する前に、次のコマンドを追加してみました少し試した後:

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

をそれから私は$em->find('Account', $id);を実行し、アカウントオブジェクトの内部教室オブジェクトが正しく返さ。

投機:

私はすべての教室のオブジェクトをロードする場合(または1つは、私のアカウントに関連付けられている)ので、エンティティがロードされ、データベースからキャッシュされる方法に問題があることを前提とする前に、私は私のfind()をして、すべての問題はありません。

私はPHPとDoctrineの初心者ですから、私はその問題を解決するためにさらなる意見や助けを求めています。 Doctrine Architecture Documentationから

答えて

4

任意のエンティティクラスのすべての永続的なプロパティ/フィールドは常にプライベートまたはを保護する必要があり、は予想通りそう遅延ロードが機能しない場合があります。

あなた$classroomプロパティは、教室のエンティティとの関連付けがレイジーロードされていません、おそらく理由である、publicです。 privateまたはprotectedに変更する必要があります(エンティティプロパティprotectedをすべてvarious reasonsにすることをお勧めします)。

問題が解決しない場合、あなたはEAGERにごOneToOne関連のfetch属性を設定してみてください可能性があり、すなわち

/** 
* @OneToOne(targetEntity="Classroom", fetch="EAGER") 
*/ 
protected $classroom; 
関連する問題