Symfony 4 - сериализация объектов с отношением ManyToMany - PullRequest
0 голосов
/ 08 июня 2018

У меня есть две сущности: приобретение и цена истории.они имеют отношение «многие ко многим», как показано ниже:

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 голосов
/ 10 июня 2018

Можно попробовать,

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Acquisition", mappedBy="services")
 *
 * @ORM\JoinTable(name="relation_table_name")
 *
 */
private $acquisitions;
0 голосов
/ 08 июня 2018

В вашем методе getAcquisitions() указан неверный тип возврата, он должен быть Collection (который реализует ArrayCollection).

...