2012-04-06 7 views
2

私は2つのエンティティ、ユーザーと住所があるとします。各ユーザーはアドレスを持つ必要があるので、テーブル間には1対1の関係があります。Doctrine 2 - One-To-One自動的に空の行を生成する

私はユーザーを生成したいと思うし、データなしでアドレス行を自動的に作成し、関係をマークするだけです。

これはEntityまたはEntityRepositoryクラスで可能ですか?またはこれを自動的に行うコマンドがありますか?

おかげ

答えて

2

まず、あなたはそれを必要としません。 Null Objectパターンを使用してください。

第二に、あなたが本当にそれを必要とする場合:

class User { 
    public function __construct() { 
     $this->setAddress(new Address); 
    } 
} 

そしてcascade persistを設定します。

* @OneToOne(targetEntity="Address", cascade={"persist"}) 
+0

次のようなものは必要ありません: '$ address = new Address();と$アドレス - > setUser($ this); '? – bksunday

+2

@aservedioこれは、関連付けが双方向か単方向かによって異なります。この記述から、単方向のように見えます。カスケード持続の例は双方向のものでしたが、それを修正しました。 – meze

1
リポジトリ内

書き込み機能:

class User_Repository { 

    public function createEmptyUserWithAddress() { 
     $user = new User(); 
     $entityManager->persist($user); 
     $entityManager->flush(); 
     $address = new Address(); 
     $entityManager->persist($address); 
     $entityManager->flush(); 
     $user->setAddress($address); 
     $address->setUser($user); 
     $entityManager->flush(); 
    } 
} 

またはユーザー(またはアドレス)のコンストラクタを拡張:

class User { 
    public function __construct(Address $address) { 
     $this->setAddress($address); 
    } 
} 

class User_Repository { 
    public function createEmptyUserWithAddress() { 
     $address = new Address(); 
     $entityManager->persist($address); 
     $entityManager->flush(); 
     $user = new User($address); 
     $entityManager->persist($user); 
     $entityManager->flush(); 
    } 
} 
+0

を作成するために)(__constructを使用することができないで複数回フラッシュする。最後のフラッシュ呼び出しは、すべての変更をフラッシュするのに十分です。 – meze

+0

ええ、知っている、ありがとう。私はpostDispatch()でフラッシュするZendプラグインを書いています。 – Askent

1

あなたは関係

class User 
{ 
    /** 
    * @OneToOne(targetEntity="Address", cascade={"persist"}) 
    */ 
    private $address; 

    public function __construct() 
    { 
     $address = new Address(); 
     $address->setUser($this); 
     $this->address = $address; 
    } 
} 
関連する問題