2016-07-16 11 views
6

Ich arbeite mit Symfony 3.1 und Doctrine 2.5.Doctrine manyToMany gibt PersistentCollection anstelle von ArrayCollection zurück

ich ein Setup ManyToMany Beziehung, wie ich es immer tue:

manyToMany: 
     placeServices: 
      targetEntity: Acme\MyBundle\Entity\PlaceService 
      joinTable: 
       name: place_place_service 
       joinColumns: 
        place_id: 
         referencedColumnName: id 
       inverseJoinColumns: 
        place_service_id: 
         referencedColumnName: id 

und Methoden hinzufügen zu meinem Entity

protected $placeServices; 

    ... 

    public function __construct() 
    { 
     $this->placeServices = new ArrayCollection(); 
    } 

    ... 

    /** 
    * @return ArrayCollection 
    */ 
    public function getPlaceServices(): ArrayCollection 
    { 
     return $this->placeServices; 
    } 

    /** 
    * @param PlaceServiceInterface $placeService 
    * @return PlaceInterface 
    */ 
    public function addPlaceService(PlaceServiceInterface $placeService): PlaceInterface 
    { 
     if(!$this->placeServices->contains($placeService)) { 
      $this->placeServices->add($placeService); 
     } 

     return $this; 
    } 

    /** 
    * @param PlaceServiceInterface $placeService 
    * @return PlaceInterface 
    */ 
    public function removePlaceService(PlaceServiceInterface $placeService): PlaceInterface 
    { 
     if($this->placeServices->contains($placeService)) { 
      $this->placeServices->removeElement($placeService); 
     } 

     return $this; 
    } 

Die Sache ist, wenn ich meine Einheit laden, Lehre eine PersistentCollection setzen in der Eigenschaft $ this> placeServices. Das klingt nicht wie ein großes Problem, außer wenn ich ein Formular erstelle, um diese beiden Entitäten zu verbinden (ein einfaches mehrfaches Kontrollkästchen mit symfony Formtyp), wenn $ form-> handleRequest() ausgelöst wird, Doctrine versucht die neuen Daten zu injizieren in meiner Entität und einen Fehler auslösen, wenn die Methode "get/add/remove" nicht verwendet wird ArrayCollection.

Ich kann meine Getter/add/remove-Methoden erzwingen, um die PersistentCollection in ArrayCollection umzuwandeln (mit der Methode unwrap), aber dann werden die Beziehungen nicht beibehalten.

Ich habe eine Problemumgehung gefunden, wenn ich fetch = "EAGER" auf die Beziehung die Eigenschaft mit ArrayCollection initialisiert wird, und die Beziehung beibehalten werden. Aber ich bin mir nicht sicher, ob es eine gute Lösung ist.

Thanks :)

+0

Können Sie mit Ihrem Symfony-Formular und der genauen Fehlermeldung aktualisieren? – galeaspablo

Antwort

15

Gerade Lehre \ Common \ Collections \ Sammlung Schnittstelle statt Arraycollection verwenden. ArrayCollection und PersistentCollection implementieren diese Schnittstelle.

Doctrine verwendet PersistentCollection für Lazy Loading-Entitäten. Sie haben Recht, die Verwendung von EAGER ist nicht immer eine gute Lösung - es kann Probleme mit der Leistung verursachen.

+0

Danke, ich habe die Idee. –

Verwandte Themen