Doctrine - прослушиватель событий (preUpdate) не обновляет связанные объекты

У меня есть клиент объекта с одним связанным адресом электронной почты объекта.

class BusinessClientCustomer
{
    /**
     * @var int
     *
     * @ORM\Column(name = "id", type = "integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name = "firstname", type = "string", length=255, nullable=true)
     */
    protected $firstname;

    /**
     * @var string
     *
     * @ORM\Column(name = "lastname", type = "string", length=255, nullable=true)
     */
    protected $lastname;

    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity = "BusinessClientCustomerEmail", mappedBy = "client_customer")
     */
    protected $emails;

В электронной почте моего класса я пытаюсь проверить через EventListener (preUpdate или другие), что есть только одно электронное письмо со значением по умолчанию = true.

class BusinessClientCustomerEmail
{
    /**
     * @var int
     *
     * @ORM\Column(name = "id", type = "integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name = "email", type = "string", length=255)
     */
    protected $email;

/**
     * @var boolean
     *
     * @ORM\Column(name = "`default`", type = "boolean")
     */
    protected $default;

    /**
     * @var BusinessClientCustomer
     *
     * @ORM\ManyToOne(targetEntity = "BusinessClientCustomer", inversedBy = "emails")
     */
    protected $client_customer;

public function __prePersist(EntityManager &$entityManager, ContainerInterface &$container) {
        var_dump('prePersist');
    }

    public function __postPersist(EntityManager &$entityManager, ContainerInterface &$container) {
        var_dump('postPersist');
    }

    public function __preUpdate(EntityManager &$entityManager, ContainerInterface &$container) {
        var_dump('preUpdate');
        if ($this->default) {
            foreach ($this->client_customer->getEmails() as $email) {
                if ($email->getId() !== $this->id) {
                    $email->setDefault(false);
                    $entityManager->persist($email);
                }
            }
        } else if (count($this->client_customer->getEmails()) === 1) {
            $this->setDefault(true);
        } else {
            $default = true;
            foreach ($this->client_customer->getEmails() as $email) {
                if ($email->getDefault()) {
                    $default = false;
                }
            }
            if ($default) {
                $this->setDefault(true);
            }
        }
    }

    public function __postUpdate(EntityManager &$entityManager, ContainerInterface &$container) {
        var_dump('postUpdate');
    }

    public function __preFlush(EntityManager &$entityManager, ContainerInterface &$container) {
        var_dump('preFlush');
        if ($this->default) {
            foreach ($this->client_customer->getEmails() as $email) {
                $email->setDefault(false);
                $entityManager->persist($email);
            }
        } else if (count($this->client_customer->getEmails()) === 0) {
            $this->setDefault(true);
        }
    }

    public function __postFlush(EntityManager &$entityManager, ContainerInterface &$container) {
        var_dump('postFlush');
    }

    public function __onFlush(EntityManager &$entityManager, ContainerInterface &$container) {
        var_dump('onFlush');
    }

Когда я обновляю электронное письмо с параметром default=true (это было ложно), это электронное письмо хорошо обновляется в БД, но другие электронные письма также сохраняют значение по умолчанию=true. Или в моей функции PreUpdate (которая хорошо называется --> я вижу это с помощью моего var_dump) я сохраняю электронную почту со значением default=false. Но никаких изменений в БД для этих писем. Что случилось ?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
373
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вам не хватает

$entityManager->flush();

после сохранения

Я получил эту ошибку, когда поставил flush(): Неустранимая ошибка: неперехваченная ошибка: достигнут максимальный уровень вложенности функции «256», прерывание! в

MatDepInfo 19.03.2019 09:15

Хорошо, просто неуместный флеш().

MatDepInfo 12.04.2019 17:28

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