2016-07-16 66 views
6

Symfony 3.1 ve Doctrine 2.5 ile çalışıyorum.Doctrine manyToMany return ArrayCollection yerine PersistentCollection

Ben kurulum hep yapmak gibi bir manyToMany ilişki:

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

Ve ben varlık yüklediğinizde şey, doktrin bir PersistentCollection konur

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

benim idareye yöntemleri eklemek $ this-> placeServices özelliğinde. $ Form-> handleRequest() tetiklendiğinde, bu iki öğeyi (symfony form türünde basit bir çoklu onay kutularını) bağlamak için bir form oluşturduğumda, yeni bir veriyi doktrinleştirmeyi denemek dışında, bu büyük bir sorun gibi görünmüyor. benim varlığımda ve/add/remove yöntemini al, ArrayCollection kullanmayan bir hata at.

Düzeltici/ekleme/çıkarma yöntemlerini PersistentCollection öğesini ArrayCollection'a dönüştürmek için (unwrap yöntemini kullanarak) zorlayabilirim, ancak yapılan ilişkiler kalıcı değil.

fetch = "EAGER" ayarlandığında, özellik ArrayCollection ile başlatılmış ve ilişkiyi sürdürdüğünüzde bir geçici çözüm buldum. Ama bunun iyi bir çözüm olduğundan emin değilim.

Teşekkür :)

+0

Symfony formunuz ve tam hata mesajıyla güncelleyebilir misiniz? – galeaspablo

cevap

15

Sadece ArrayCollection yerine \ Koleksiyon arayüzünü Doktrin \ Common \ Koleksiyonlar'ı kullanın. ArrayCollection ve KalıcılıkKoleksiyon bu arabirimi uygular.

Doctrine, tembel yükleme varlıkları için PersistentCollection kullanır. Haklısınız, EAGER kullanmak her zaman iyi bir çözüm değildir - performans sorunlarına neden olabilir.

+0

Teşekkürler, fikri anlıyorum. –