带有Symfony4 Doctrine2多到许多双向的OutofMemoryException



我有两个实体, 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序列化器捆绑包(吸收了系统的所有内存。

相关内容

  • 没有找到相关文章

最新更新