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