Доктрина 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 8

1 ответ:

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

Доктрина использует PersistentCollection для ленивой загрузки сущностей. Вы правы, использование EIGHTER не всегда является хорошим решением - это может вызвать проблемы с производительностью.