2013-04-19 3 views
9

In einem Zend Framework 2-Projekt haben wir zwei Einheiten Lehre 2 und wir möchten ein Element aus einer Sammlung allready in der Datenbank gespeichert entfernen ...Element aus ArrayCollection auf OneToMany entfernen löscht es nicht auf persist()?

So haben wir eine erste Einheit FormGroupConstraint genannt:

/** 
* FormGroupConstraint 
* 
* @ORM\Table(name="form_group_constraint") 
* @ORM\Entity(repositoryClass="Application\Dao\FormGroupConstraintDao") 
*/ 
class FormGroupConstraint { 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 

    /** 
    * @param \Doctrine\Common\Collections\ArrayCollection 
    * @ORM\OneToMany(targetEntity="Application\Entity\FormQuestionConstraint", mappedBy="groupConstraint", fetch="EAGER", cascade={"persist", "merge", "refresh", "remove"}) 
    */ 
    protected $constraints; 

    public function __construct() 
      $this->constraints = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * @param \Doctrine\Common\Collections\ArrayCollection $constraints 
    */ 
    public function addConstraints($constraints) { 
     foreach ($constraints as $constraint) { 
      $this->constraints->add($constraint); 
     } 
     return $this->constraints; 
    } 
    /** 
    * @param \Doctrine\Common\Collections\ArrayCollection $constraints 
    */ 
    public function removeConstraints($constraintsToRemove) { 
      foreach ($constraintsToRemove as $key => $constraintToRemove) { 
       $this->constraints->removeElement($constraintToRemove); 
      } 
      return $this->constraints; 
    } 
} 

Und die Untereinheit namens FormQuestionConstraint:

So

wenn wir versuchen, zu schaffen, bestehen bleiben, eine FormGroupConstraint Einheit spülen, kein Problem, aber wenn wir ein Element von $ Einschränkungen Arraycollection entfernt werden soll, passiert nichts ...

Wir verwenden Lehre-orm -Modul für zend 2 installiert mit composer.phar in dev-master ...

Hier ist ein Beispiel dafür, was wir zu tun versuchen:

$constraint = $this->findConstraintByGroup(1); 

$formGroupConstraint = $this->_em->findOneById(1); 

$formGroupConstraint->getConstraints()->removeElement($constraint); 
$this->_em->persist($formGroupConstraint); 
$this->_em->flush(); 

Kein Fehler, aber keine löschen oder entfernen ... Und wenn wir var_dump(), um die getConstraints() vor bestehen bleiben(), eigentlich das Element noch in der Arraycollection ...

Könnte jemand erklären uns, wie wir konnten, Tun Sie das oder warum wird das Element nicht entfernt?

Antwort

3

Da der Bezug auf FormQuestionConstraint gehalten wird was Sie tun müssen:

$this->_em->remove($constraint); 
$this->_em->flush(); 
+0

Vielen Dank für Ihre Antwort, aber das Problem ist, wenn wir in einer Schleife über die Arraycollection versuchen Weichen Einheiten zu sehen entfernt werden, da keine Änderungen zwischen der Datenbank und der aktuellen Arraycollection ... Alle removeElement ($ Einschränkung) ist nutzlos ??? Warum diese Methode nichts auf der ArrayCollection tun? (Hibernate-Liste oder andere ORM Collection-Container könnte so funktionieren ...) –

+0

Es gibt keine Änderung an der '' ArrayCollection'' auch nach dem Aufruf von '' flush() '' ?? versuchen Sie es '' $ this -> _ em-> flush() '' wenn nicht. –

+0

Was wir tun möchten ist: ** 1: load $ formGroupConstraint ** ** 2: Entfernen Sie Elemente durch den Aufruf von $ formGroupConstraint-> getConstraints() -> removeElement ($ Constraint); ** ** 3 : am Ende $ $ this -> _ em-> persist ($ formGroupConstraint); $ this -> _ em-> flush(); **. Aber nichts ist aus der Sammlung oder aus der Datenbank entfernt. Ist dieser Prozess möglich? –

29

Vielleicht ein bisschen spät, aber versuchen orphanRemoval=true der inversen Seite Zugabe (OneToMany) der Beziehung

@ORM\OneToMany(
    targetEntity="Application\Entity\FormQuestionConstraint", 
    mappedBy="groupConstraint", 
    cascade={"persist", "remove"}, 
    orphanRemoval=true 
) 
+0

Dies ist eine bessere Lösung als die erste, keine Notwendigkeit für zusätzlichen Code. –

+0

Im Fall von YAML für andere Benutzer (wie mich): orphanRemoval: true im "linken" Feld für die OneToMany-Beziehung. –

+0

Warum ist es so schwer, etwas für Symfonie oder Doktrin zu finden, heh, danke, es ist eine großartige Antwort! –

4

Sie könnte hinzufügen auf der OneToMany Seite der Beziehung, zum Beispiel so:

@ORM\OneToMany(
    targetEntity="Application\Entity\FormQuestionConstraint", 
    mappedBy="groupConstraint", 
    cascade={"all"}, 
    orphanRemoval=true 
) 

Der Grund für dieses Verhalten ist, dass die Entität aus der ArrayCollection entfernt wird, der Inhalt der Auflistung jedoch nur vom Fremdschlüssel der untergeordneten Entität bestimmt wird, der auf die übergeordnete Entität verweist.

Wenn die Doktrin die Kinder der übergeordneten Entität das nächste Mal nachschlägt, ist sie immer noch vorhanden und wird in der nächsten Anfrage erneut angezeigt, wenn die ArrayCollection erneut aus der Datenbank abgerufen wird.

Wenn orphanRemoval auf true eingestellt ist, werden solche untergeordneten Entitäten unter persist() entfernt.

Verwandte Themen