2012-04-06 6 views
2

Sagen wir, ich habe 2 Entitäten, Benutzer und Adresse. Jeder Benutzer muss eine Adresse haben, so dass eine Eins-zu-Eins-Beziehung zwischen den Tabellen besteht.Doktrin 2 - Eins-zu-eins Generiere automatisch leere Zeilen

Jetzt möchte ich einen Benutzer generieren und es sollte automatisch eine Adresszeile ohne Daten erstellen und nur ihre Beziehung markieren.

Ist dies in der Entity oder in der EntityRepository-Klasse möglich? Oder gibt es einen Befehl, der das automatisch macht?

Dank

Antwort

2

Zuerst Sie brauchen es nicht. Verwenden Sie Null Object Muster.

Zweitens, wenn Sie es wirklich brauchen:

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

Und gesetzt cascade persist:

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

Benötigen Sie nicht etwas wie: '$ address = new Address(); und $ address-> setUser ($ this); '? – bksunday

+2

@aservedio hängt davon ab, ob die Zuordnung bidirektional oder unidirektional ist. Aus der Beschreibung sieht es wie unidirektional aus. Obwohl das Beispiel von cascade persist für bidirektional war, wurde das behoben. – meze

1

Write-Funktion in Repository:

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(); 
    } 
} 

oder erweitern Konstruktor Benutzer (oder Adresse):

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

Nicht zu erstellen spüle mehr als einmal. Der letzte Flush-Aufruf reicht aus, um alle Änderungen zu löschen. – meze

+0

Ja, ich weiß, danke. Ich habe das Zend-Plugin geschrieben, das in postDispatch() flush macht. – Askent

1

Sie die __construct verwenden können() eine Beziehung

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

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