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

11

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

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

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

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

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

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

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

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

Ваш Ответ

3   ответа
0

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

23

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

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

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

Может быть, вы могли бы использовать UUID для этой задачи, так как они практически уникальны En.wikipedia.org / вики / Universally_unique_identifier) и они могут быть сгенерированы заранее, например, из PHP. Мне они не очень нравятся, но было бы хорошим решением. JorgeeFG
@ JorgeeFG - Абсолютно. UUID отлично подходят для этого варианта использования. За годы, прошедшие с момента написания этого ответа, я начал отдавать предпочтение UUID в качестве идентификаторов для сущностей. Github.com / Ramsey / UUID - довольно солидная библиотека для их генерации, а Github.com / Ramsey / UUID-доктрина обеспечивает реализацию типа доктрины, которая хорошо работает. timdev
Большое спасибо за Ваш ответ Xavi
6

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

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.
     }

     ...

}

Похожие вопросы