我正在使用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;
    }

问题是,当我加载我的实体时,主义在$ this-> placeServices属性中放置了一个 PersistentCollection 。这听起来不像是一个大问题,只是当我构建一个连接这两个实体的表单(具有symfony表单类型的简单多个复选框)时,当触发$ form-> handleRequest()时,Doctrine尝试注入(inject)新数据在我的实体中,如果get/add/remove方法未使用 ArrayCollection ,则抛出错误。

我可以强制我的getter/add/remove方法将PersistentCollection转换为ArrayCollection(使用unwrap方法),但是建立的关系不会持久。

我发现了一种解决方法,如果我在关系上设置 fetch =“EAGER” ,则该属性将使用ArrayCollection进行初始化,并且该关系将保持不变。但是我不确定这是一个好的解决方案。

谢谢 :)

最佳答案

只需使用 Doctrine\Common\Collections\Collection 接口(interface),而不是 ArrayCollection 即可。 ArrayCollection PersistentCollection 实现此接口(interface)。

Doctrine将 PersistentCollection 用于延迟加载实体。没错,使用EAGER并不总是一个好的解决方案-它可能会导致性能问题。

关于php - 学说manyToMany返回PersistentCollection而不是ArrayCollection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38410665/

10-12 12:30