У меня есть поле под названием «refNo
«в объекте под названием»Job
«, этот номер создается путем помещения государственные инициалы и id + 2023. Это означает, что если эта работа выполняется в Калифорнии, а идентификатор этого объекта равен 2, refNo должен быть: CA-2025
,
У меня есть этот код:
public function __construct()
{
$this->refNo = $this->state . '-'. ($this->id + 2023);
}
Это сделало бы идентификатор каждого CA-2023, что означает, что идентификатор не генерируется до его создания. Я пытался сделать с помощью этих @HasLifecycleCallbacks: prePersist , postPersist , preFlush , onFlush
в этом случае:
/**
* @PostPersist
*/
public function jobNo()
{
$this->jobNo = $this->id + 2286;
}
Неудачно. Во всяком случае, как я могу этого добиться? Спасибо
Проблема в том, что вы создаете сущность в БД, и ей присваивается ID. Тогда ваш @PostPersist
метод вызывается и устанавливает jobNo
, Тем не менее, вы не flush
снова после этого, даже если ваш jobNo
установлено, Вы никогда не сохраняете это в базе данных.
Решение состоит в том, чтобы повторно сохранить его снова в базе данных впоследствии.
Я использую отдельный приемник событий для генерации кода (ов) для различных объектов. Это упрощенный пример, который вызывает $entity->generateRef();
после того, как сущность создана.
<?php
namespace Example\CommonBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
class CodeAssembler
{
public function postPersist(LifecycleEventArgs $args)
{
$classes = array(
'Example\CommonBundle\Entity\Job',
);
$entity = $args->getEntity();
if (in_array(get_class($entity), $classes)) {
$entity->generateRef();
$args->getEntityManager()->flush();
}
}
}
Прикрепить прослушиватель событий:
# services.yml
example_common.code_assembler_listener:
class: Example\CommonBundle\EventListener\CodeAssembler
tags:
- { name: doctrine.event_listener, event: postPersist }