У меня есть клиент объекта с одним связанным адресом электронной почты объекта.
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. Но никаких изменений в БД для этих писем. Что случилось ?
вам не хватает
$entityManager->flush();
после сохранения
Хорошо, просто неуместный флеш().
Я получил эту ошибку, когда поставил flush(): Неустранимая ошибка: неперехваченная ошибка: достигнут максимальный уровень вложенности функции «256», прерывание! в