Symfony 4 - сериализация объектов с отношением ManyToMany

У меня есть две сущности: 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

Как я могу это исправить?

Большое спасибо за помощь.

Пьер

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 232
2

Ответы 2

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

БОЛЬШОЙ Извините за введение в заблуждение. Оригинал является коллекционной подсказкой. Я поставил Array Collection, чтобы попробовать этот способ ... Так что даже со сбором я получаю эту ошибку !! Я отредактировал свой пост

123pierre 08.06.2018 20:07

Чего я не понимаю, так это того, что объект Acquisition $ tempCart создан, и только когда я его сериализую, я получил ошибку.

123pierre 08.06.2018 20:19

Возможно, это не так на STackoverflow, но я публикую свое исследование по крупицам. Я считаю, что @MaxDepth (1) ИЛИ setCircularReferenceHandler () принимаются во внимание ... Но я не знаю почему.

123pierre 08.06.2018 20:54

@ 123pierre Попробуйте воссоздать прокси, возможно, они не обновлялись после изменения подсказки типа возвращаемого значения. Кроме этого, невозможно получить такую ​​же ошибку IMO

malarzm 09.06.2018 14:29

Лично я отказываюсь от сложной сериализации объекта Doctrine. Либо слишком сложно (для меня), либо не готово ... :-( Честно говоря, на сериализацию через старую школу с циклами foreach уйдет гораздо меньше времени ...

123pierre 19.06.2018 16:35

Можешь попробовать,

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

Другие вопросы по теме