2012-04-06 60 views
2

可以說我有2個實體,用戶和地址。每個用戶必須有一個地址,因此表格之間有一對一的關係。Doctrine 2 - 一對一自動生成空行

現在我想要生成一個用戶,它應該自動創建一個沒有數據的地址行,並且只是標記它們的關係。

這是可能的實體或EntityRepository類?還是有一個命令可以自動執行此操作?

感謝

回答

2

首先,你不需要它。使用Null Object模式。

第二,如果你真的需要它:

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

並設置cascade persist

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

你不需要像這樣的東西:'$ address = new Address();和$ address-> setUser($ this);'? – bksunday 2012-08-21 14:37:48

+2

@aservedio它取決於關聯是雙向的還是單向的。從描述看起來像是單向的。雖然cascade的例子是雙向的,但修正了這個問題。 – meze 2012-08-21 18:03:10

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

不要做多次沖洗。上次刷新調用將足以清除所有更改。 – meze 2012-04-06 16:56:32

+0

是的,我知道,謝謝。我編寫了Zend插件,它在postDispatch()中使用flush。 – Askent 2012-04-11 19:57:35

1

可以使用__construct()創建一個關係

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

    public function __construct() 
    { 
     $address = new Address(); 
     $address->setUser($this); 
     $this->address = $address; 
    } 
}