Doctrine2 - получить идентификатор объекта до сброса

Есть ли способ получить идентификатор сущности перед сохранением / сбросом? Я имею в виду

<code>$entity = new PointData();
$form   = $this->createForm(new PointDataType(), $entity);
</code>

Если я попробую $ Entity-> GetId () в этот момент ничего не возвращается.

Я могу заставить его работать:

<code>$em->persist($entity);
$em->flush();
</code>

(предположим $ em = $ this-> getDoctrine () -> getEntityManager ();)

Как мне этого добиться?

 Xavi07 мая 2012 г., 18:42
Спасибо тебе, Крозин. Я уже прочитал все это. Я не пытаюсь получить следующий авто индекс. Сбой, если 2 пользователя вызвали это действие одновременно.
 Crozin07 мая 2012 г., 18:39
Читать о стратегии генерации идентификаторов на страницах документации Доктрины.

Ответы на вопрос(3)

чтобы получить ключ, такой как универсально уникальные идентификаторы (UUID), или вы можете использовать события symfony: postFlush - событие postFlush происходит в конце операции сброса.

Решение Вопроса

анных, то, очевидно, вы не сможете использовать сгенерированные идентификаторы. Вам нужно будет найти какой-то способ самостоятельно генерировать уникальные идентификаторы (возможно, какая-то хеш-функция может генерировать достаточно уникальные значения).

Это редко хорошая идея, поэтому будь осторожен.

Я бы очень внимательно подумал о том, почему мне нужно знать идентификатор перед тем, как делать сброс. Doctrine довольно хорошо позволяет вам создавать большой граф объектов и сохранять / сбрасывать его сразу. Вероятно, в вашей архитектуре есть что-то уродливое, что вы пытаетесь обойти. Это может быть хорошей идеей, чтобы проверить это, прежде чем идти по маршруту сгенерированного идентификатора приложения.

 JorgeeFG05 янв. 2017 г., 19:16
Может быть, вы могли бы использовать UUID для этой задачи, так как они практически уникальны En.wikipedia.org / вики / Universally_unique_identifier) и они могут быть сгенерированы заранее, например, из PHP. Мне они не очень нравятся, но было бы хорошим решением.
 timdev05 янв. 2017 г., 20:50
@ JorgeeFG - Абсолютно. UUID отлично подходят для этого варианта использования. За годы, прошедшие с момента написания этого ответа, я начал отдавать предпочтение UUID в качестве идентификаторов для сущностей. Github.com / Ramsey / UUID - довольно солидная библиотека для их генерации, а Github.com / Ramsey / UUID-доктрина обеспечивает реализацию типа доктрины, которая хорошо работает.
 Xavi11 мая 2012 г., 10:43
Большое спасибо за Ваш ответ

помеченный этим, будет выполнен непосредственно перед завершением сброса, и идентификатор объекта уже доступен.

https: //www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.htm

postPersist - Событие postPersist наступает для объекта после того, как объект стал постоянным. Он будет вызван после операций вставки базы данных. Сгенерированные значения первичного ключа доступны в событии postPersist.

<?php

use Doctrine\ORM\Mapping as ORM;

/** 
 * @ORM\Entity 
 * @ORM\HasLifecycleCallbacks 
 */
class PointData
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

     ...

     /** 
      * @ORM\PostPersist 
      */
     public function onPostPersist()
     {
         // Put some simple logic here that required the auto-generated Id.
     }

     ...

}

Ваш ответ на вопрос