Doctrine2 - получить идентификатор сущности перед запуском
Есть ли способ получить идентификатор объекта до сохранения/сброса?
Я имею в виду:
$entity = new PointData();
$form = $this->createForm(new PointDataType(), $entity);
Если в этот момент я попробую $entity- > getId(), он ничего не возвращает.
Я могу заставить его работать:
$em->persist($entity);
$em->flush();
(предположим $em = $this- > getDoctrine() → getEntityManager();)
Как я могу это достичь?
Ответы
Ответ 1
Если вы хотите узнать идентификатор объекта до его сохранения в базе данных, вы, очевидно, не сможете использовать сгенерированные идентификаторы. Вам нужно будет найти способ генерировать уникальные идентификаторы самостоятельно (возможно, какая-то хеш-функция может создавать уникальные значения).
Это редко бывает хорошей идеей, поэтому вы должны быть осторожны.
Я бы очень тщательно подумал, почему мне нужно знать идентификатор перед флешем. Доктрина неплохо позволяет создать крупный объектный граф, и он будет продолжать/скрывать все сразу. Похоже, что у вас в вашей архитектуре есть что-то уродливое, с которым вы пытаетесь работать. Возможно, будет хорошей идеей рассмотреть это, прежде чем спускать маршрут сгенерированный приложением.
Ответ 2
Вы можете использовать аннотацию @PostPersist. Метод, аннотированный с ним, будет выполнен непосредственно перед завершением работы флеша, и идентификатор объекта уже доступен.
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-postpersist