Доктрина manyToMany возврат PersistentCollection вместо ArrayCollection
Я работаю с Symfony 3.1 и Doctrine 2.5.
Я устанавливаю множество отношений, как я всегда делаю:
manyToMany:
placeServices:
targetEntity: AcmeMyBundleEntityPlaceService
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 () является срабатывает, доктрина пытается ввести новые данные в мою сущность и выдает ошибку, если метод get/add/remove не использует ArrayCollection.
Я могу заставить мои методы getter / add / remove преобразовать PersistentCollection в ArrayCollection (используя метод unwrap), но тогда выполненные отношения не сохраняются.
Я нашел обходной путь, если я установлю fetch= "нетерпеливый" на отношение, свойство инициализируется с ArrayCollection, и отношение сохраняется. Но я не уверен, что это хорошее решение.
Спасибо :)
1 ответ:
Просто используйтеDoctrine\Common\Collections\Collection интерфейс вместоArrayCollection . ArrayCollection иPersistentCollection реализуют этот интерфейс.
Доктрина использует PersistentCollection для ленивой загрузки сущностей. Вы правы, использование EIGHTER не всегда является хорошим решением - это может вызвать проблемы с производительностью.