Doctrine manyToMany возвращает PersistentCollection вместо ArrayCollection

Я работаю с Symfony 3.1 и Doctrine 2.5.

Я настраиваю отношения manyToMany, как всегда:

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

И добавьте методы в свой объект

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

Дело в том, что когда я загружаю свою сущность, доктрина ставит PersistentCollection в свойство $ this-> placeServices. Это не похоже на большую проблему, за исключением того, что когда я создаю форму для соединения этих двух объектов (простые множественные флажки с типом формы symfony), когда запускается $ form-> handleRequest (), Doctrine пытается ввести новые данные в моей сущности и выкинуть ошибку, если метод get / add / remove не использует ArrayCollection .

Я могу заставить мои методы getter / add / remove преобразовать PersistentCollection в ArrayCollection (используя метод разворота), но тогда созданные отношения не сохраняются.

Я нашел обходное решение, если я установил fetch = "EAGER" в отношении, которое свойство инициализируется с помощью ArrayCollection, и отношение сохраняется. Но я не уверен, что это хорошее решение.

Благодаря 🙂

Просто используйте Doctrine \ Common \ Collections \ Collection интерфейс вместо ArrayCollection . ArrayCollection и PersistentCollection реализуют этот интерфейс.

Doctrine использует PersistentCollection для ленивых загрузочных объектов. Вы правы, использование EAGER не всегда является хорошим решением – это может вызвать проблемы с производительностью.