Symfony 4 - 具有ManyToMany关系的对象的序列化

时间:2018-06-08 16:19:27

标签: serialization doctrine-orm symfony4

我有两个实体:Acquistion& priceHistory。 他们有如下多对多的关系:

Aquisition.php

....
    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\PriceHistory", inversedBy="acquisitions")
     * @MaxDepth(1)
     */
    private $services;
    public function __construct()
    {
        $this->services = new ArrayCollection();
        ....
    }

   /**
     * @return Collection|ServicePrice[]
     */
    public function getServices(): Collection
    {
        return $this->services;
    }

    public function addService(ServicePrice $service): self
    {
        if (!$this->services->contains($service)) {
            $this->services[] = $service;
        }

        return $this;
    }

    public function removeService(ServicePrice $service): self
    {
        if ($this->services->contains($service)) {
            $this->services->removeElement($service);
        }

        return $this;
    }

PriceHistory.php

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Acquisition", mappedBy="services")
     */
    private $acquisitions;

    public function __construct(){
        $this->acquisitions = new ArrayCollection();
    }

   /**
     * @return Collection|Acquisition[]
     */
    public function getAcquisitions(): Collection
    {
        return $this->acquisitions;
    }

    public function addAcquisition(Acquisition $acquisition): self
    {
        if (!$this->acquisitions->contains($acquisition)) {
            $this->acquisitions[] = $acquisition;
            $acquisition->addService($this);
        }

        return $this;
    }

    public function removeAcquisition(Acquisition $acquisition): self
    {
        if ($this->acquisitions->contains($acquisition)) {
            $this->acquisitions->removeElement($acquisition);
            $acquisition->removeService($this);
        }

        return $this;
    }

它正常工作,模式正确创建,实体持久化等等。

但我想按顺序序列化和反序列化Acquiisition对象:

$encoders = array(new JsonEncoder());
        $objectNormalizer = new ObjectNormalizer(); 
        $objectNormalizer->setCircularReferenceHandler(function ($object) {
            return $object->getId();
        });
        $normalizers = array(new DateTimeNormalizer(), $objectNormalizer);
        $serializer = new Serializer($normalizers, $encoders);
        $tempCart = new Acquisition();
        $service_prices = $this->getDoctrine()->getRepository(ServicePrice::class)->findAll()[0];
        $tempCart->addService($service_prices);
        $jsonContent = $serializer->serialize($tempCart, 'json');

这给我以下错误:

Type error: Return value of App\Entity\PriceHistory::getAcquisitions() must be an instance of Doctrine\Common\Collections\ArrayCollection, instance of Doctrine\ORM\PersistentCollection returned

我该如何解决这个问题?

非常感谢你的帮助。

皮尔

2 个答案:

答案 0 :(得分:1)

您的getAcquisitions()方法中的返回类型提示错误,应为CollectionArrayCollection实现)。

答案 1 :(得分:0)

你可以尝试,

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Acquisition", mappedBy="services")
 *
 * @ORM\JoinTable(name="relation_table_name")
 *
 */
private $acquisitions;