Доктрина: Генерация ссылочного номера из ID

У меня есть поле под названием «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;
}

Неудачно. Во всяком случае, как я могу этого добиться? Спасибо

2

Решение

Проблема в том, что вы создаете сущность в БД, и ей присваивается ID. Тогда ваш @PostPersist метод вызывается и устанавливает jobNo, Тем не менее, вы не flush снова после этого, даже если ваш jobNo установлено, Вы никогда не сохраняете это в базе данных.

Решение состоит в том, чтобы повторно сохранить его снова в базе данных впоследствии.

1

Другие решения

Я использую отдельный приемник событий для генерации кода (ов) для различных объектов. Это упрощенный пример, который вызывает $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 }
0

По вопросам рекламы [email protected]