我有两个实体, mapparking 和 mapparkingType 。Mapparking(一个停车场(实体可以拥有多种类型,而MapparkingType(Lot类型(属于许多停车场。
我遇到的问题是,当我进入联接表中的大约50个条目时,每当我尝试加载任何以任何方式使用MapparkingType实体的视图时,Symfony cho缩了。
错误是:
(1/1(OUTOFMEMORYEXCEPTION
错误:允许的内存大小为134217728字节耗尽(尝试 分配23072768字节(
这是我相关的mapparking实体类代码:
class MapParking extends MapItem
{
...
/**
* Many Parking lots have Many types.
* @ORMManyToMany(targetEntity="AppEntityMapMapParkingType", inversedBy="parkingLots")
* @ORMJoinTable(name="mapparking_types",
* joinColumns={@ORMJoinColumn(name="mapparking_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="type_id", referencedColumnName="id")}
* )
* @ORMOrderBy({"name" = "ASC"})
* @SerializerSerializedName("parkingTypes")
*/
private $parkingTypes;
public function __construct() {
$this->parkingTypes = new ArrayCollection();
}
...
public function getParkingTypes()
{
return $this->parkingTypes;
}
public function addParkingType(MapParkingType $parkingType)
{
if ($this->parkingTypes->contains($parkingType)) {
return;
}
$this->parkingTypes->add($parkingType);
$parkingType->addParkingLot($this);
}
public function removeParkingType(MapParkingType $parkingType)
{
if (!$this->parkingTypes->contains($parkingType)) {
return;
}
$this->parkingTypes->removeElement($parkingType);
$parkingType->removeParkingLot($this);
}
}
和相关的mapparkingtype实体类代码:
class MapParkingType
{
...
/**
* @ORMManyToMany(targetEntity="MapParking", mappedBy="parkingTypes")
*/
private $parkingLots;
...
public function addParkingLot(MapParking $parkingLot)
{
if ($this->parkingLots->contains($parkingLot)) {
return;
}
$this->parkingLots->add($parkingLot);
$parkingLot->addParkingType($this);
}
public function removeParkingLot(MapParking $parkingLot)
{
if (!$this->parkingLots->contains($parkingLot)) {
return;
}
$this->parkingLots->removeElement($parkingLot);
$parkingLot->removeParkingType($this);
}
}
有趣的是,如果我摆脱了这种关系的双向性质,也就是说,删除倒数的$ ParkingLots字段,问题就会消失。但是,我需要这是双向关系。
良好的方法是通过API方法获取MapparkingType实体的方式:
public function getMapparkingtypesAction()
{
$parkingTypes = $this->getDoctrine()->getRepository(MapParkingType::class)->findAll();
$serializer = $this->container->get('jms_serializer');
$serialized = $serializer->serialize($parkingTypes, 'json');
$response = new Response($serialized, 200, array('Content-Type' => 'application/json'));
return $response;
}
我看到你有递归调用
方法 addParkingType
调用 addParkingLot
和viceversa,这就是为什么你不在内存中。
答案实际上与关系类型没有任何关系,而是与 serialializer 。我不得不将MapparkingType的$ ParkingLots字段从序列化中排除。
// MapParkingType
/**
* @ORMManyToMany(targetEntity="MapParking", mappedBy="parkingTypes")
* @SerializerExclude
*/
private $parkingLots;
关于序列化关系的两面(使用JMS序列化器捆绑包(吸收了系统的所有内存。