2012-08-17 2 views
10

Ich habe diesen CodeLehre 2 nicht die Beziehung persistierenden von Seite besitzen ein bis Viele

// ONE to many Bidir -- inverse side 
    /** 
    * @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
    **/ 
    protected $items; 

Die andere Seite

// ONE to many Bidir-- own side 
    /** 
    * @ORM\ManyToOne(targetEntity="Room", inversedBy="items") 
    * @ORM\JoinColumn(name="room_id", referencedColumnName="id") 
    **/ 
    protected $room; 

Mein Problem ist, dass ich auf Artikelseite gehen und ich wählen Zimmer, dann kann er Artikel, preselecetd in Zimmer Seite

Aber wenn ich zu Room-Seite und ich versuche, viele Artikel zu multiselect, dann bleiben die sind nicht

EDIT: Ich habe gesehen, dass es nur für OneToMany Relationship geschieht. Für Manyto Viele sie arbeiten gut

EDIT2:

ich über die Back-End-Bereich spreche, wo ich das Formular aus und wählen Sie Feld, wo ich mehrere Elemente auswählen können. Diese Form/CRUD-Code/Controller werden von der Doktrin erstellt. SO muss ich keine zusätzliche Funktion hinzufügen. Jede Art und Weise das ist mein Controller-Code

$editForm = $this->createForm(new RoomType(), $entity); 


     $request = $this->getRequest(); 

     $editForm->bindRequest($request); 
     if ($editForm->isValid()) { 
      $em->persist($entity); 
      $em->flush(); 

Wenn ich versuche, wie diese

in der Steuerung zu Fuß durch
foreach($entity->getItems() as $item) 
     echo $item; 

Dann kann ich dort alle Thye Einzelteile sehen. Es bedeutet also, dass alle Objekte im Hauptobjekt vorhanden sind, aber nicht bestehen. Ich weiß nicht warum.

Wenn es wegen, Rückseite Problem gibt. Wie kann ich die Beziehung von wegen inverse und inverse zu besitzenden

+1

Nicht sicher, wie Ihr Code aussieht, oder Ihre Datenbank, einige Beispiele wären nützlich. – Asciiom

Antwort

10

Ihr Code ist falsch, basierend auf Ihren Kommentaren in Anmerkungen.

Dies ist die besitzen Seite, weil Sie das inversedBy Attribut angeben:

/** 
* ONE to many Bidir-- Inverse side 
* @ORM\ManyToOne(targetEntity="Room", inversedBy="items") 
* @ORM\JoinColumn(name="room_id", referencedColumnName="id") 
**/ 
protected $room; 

Dies ist die inverse Seite (weil es das mappedBy Attribut): So

/** 
* ONE to many Bidir -- owning side 
* @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
**/ 
protected $items; 

Ihr Code sagt: Item ist die besitzende Seite, Room ist die inverse Seite.

Die Seite besitzt eine bidirektionalen Beziehung zu seiner inversen Seite durch Verwendung des inversedBy Attributs des OneToOne verweisen, ManyToOne oder ManyToMany Mapping Erklärung. Das inversedBy-Attribut bezeichnet das Feld in der Entität, das die umgekehrte Seite der -Beziehung ist.

Um es sauber:

Die besitzende Seite hat das inversedBy Attribut des OneToOne zu verwenden, ManyToOne oder ManyToMany Mapping Erklärung.Das inversedBy-Attribut enthält den Namen des Assoziationsfelds auf der inversen Seite.

Während für die inverse Seite:

Die inverse Seite einer bidirektionalen Beziehung zu seinem besitzen neben Verwendung der mappedBy Attribut des OneToOne verweisen, OneToMany- oder ManyToMany-Zuordnungsdeklaration. Das mappedBy-Attribut bezeichnet das Feld in der Entität, die der Besitzer der -Beziehung ist.

Und wieder:

Die inverse Seite hat das mappedBy Attribut des OneToOne zu verwenden, OneToMany oder ManyToMany Mapping Erklärung. Das Attribut mappedBy enthält den Namen des Assoziationsfelds auf der besitzenden Seite.

Plus ein weiterer wichtiger Aspekt: ​​

ManyToOne ist immer der besitzende Seite einer bidirektionalen assocation.

OneToMany ist immer die inverse Seite einer bidirektionalen assocation

So werden Elemente aus der inversen Seite (Raum) persistierende, müssen Sie überprüfen, welche Artikel/abgewählt wurde und wenn Zimmer bereits enthält, dass Artikel oder nicht.

+2

Ich könnte falsch sein zu sagen, welche Seite besitzt und inverse aber Code sollte in beiden Richtungen arbeiten. Ich habe Kaskade {persistieren} auf jeder Seite und auf beiden Seiten, aber es hat nicht funktioniert. Auch wenn du kein Gegenstand für diesen Raum bist, und ich wähle 5 Gegenstände aus, nichts geht in die Datenbank. und das passiert für eine weitere Klasse. also denke ich, dass ich etwas in meinem Code hinzufügen muss, damit invers geschieht. Ist mein Code in Ordnung, unabhängig davon, was Eigentümer und inverse Seite ist – user825904

3

Verwenden Sie einfach Sie Schleife, um Raum zu setzen. Item ist Seite geschuldet und Sie bearbeiten inverse Seite (Raum). Symfony2 aktualisiert nie die Seiten, während die Inverse bearbeitet wird.

Die einfachste Lösung für Sie Schleife verwenden, bevor persistierenden Raum:

foreach($entity->getItems() as $item){ 
    $item->setRoom($room); 
} 

und Kaskade auf inverse Seite:

/** 
* @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
**/ 
protected $items; 

Für meine Projekte, die ich wiederverwendbare Lösung Ereignisse auf Sammlung Zuhörer gemacht basiert. Wenn Sie Zeit haben & Fähigkeiten ermutigen Sie, das gleiche zu tun

+0

Ich denke, ich muss auch in der Schleife als auch persistieren. Über welches Sammelereignis redest du, kannst du mir einen Verweis oder einen Link geben? – user825904

+0

Wenn Sie eine Kaskade auf der inversen Seite haben, müssen Sie sie nicht persistieren. Wenn Sie es vorher bekommen haben, wurden wahrscheinlich alle Objektdaten gespeichert, aber ohne Elternzimmer. –

+0

Lesen Sie über Formularereignisse: http: // stackoverflow.com/questions/9651095/description-of-symfony2-form-events, sammlung ist nur form einbetten von einzelteilen –

Verwandte Themen