2012-05-07 14 views
10

Czy istnieje jakiś sposób uzyskania identyfikatora jednostki przed utrwaleniem/opróżnieniem? Znaczy:Doctrine2 - Uzyskaj identyfikator podmiotu przed opróżnieniem

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

Gdy próbuję $ entity-> getId() w tym momencie, to nic nie zwraca.

mogę dostać pracy przez:

$em->persist($entity); 
$em->flush(); 

(zakładając $ em = $ this-> getDoctrine() -> getEntityManager();)

W jaki sposób można to osiągnąć?

+0

Czytaj o [strategie generacji identyfikatora] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifiers-primary- klucze) na stronach dokumentacji Doctrine. – Crozin

+0

Dziękuję Crozin. Przeczytałem już wszystkie te rzeczy. Nie próbuję uzyskać następnego indeksu auto. Byłoby to niemożliwe, gdyby 2 użytkownicy wywoływali tę akcję jednocześnie. – Xavi

Odpowiedz

23

Jeśli chcesz poznać identyfikator jednostki przed jej utrwaleniem w bazie danych, to oczywiście nie możesz używać wygenerowanych identyfikatorów. Musisz znaleźć sposób na samodzielne wygenerowanie unikalnych identyfikatorów (być może jakaś funkcja hash może wytworzyć unikalne wartości).

To rzadko jest dobry pomysł, więc należy zachować ostrożność.

Zastanowiłbym się bardzo dokładnie, dlaczego muszę znać identyfikator przed spłukiwaniem. Doctrine jest całkiem niezła w tworzeniu wykresu dużego obiektu i utrzymywania/płukania wszystkiego na raz. Wygląda na to, że masz w swojej architekturze coś paskudnego, co próbujesz obejść. Dobrym pomysłem byłoby przejrzenie tego przed zejściem z trasy generowanej przez aplikację.

+0

Dziękuję bardzo za odpowiedź. – Xavi

+0

Może mógłbyś użyć UUID do tego zadania, ponieważ są one praktycznie unikalne (https://en.wikipedia.org/wiki/Universally_unique_identifier) ​​i mogą być generowane z góry, na przykład z PHP. Nie lubię ich zbyt wiele, ale byłoby to dobre rozwiązanie. – JorgeeFG

+1

@JorgeeFG - Absolutnie. UUID są świetne w tym przypadku. W latach, od kiedy napisałem tę odpowiedź, zacząłem preferować identyfikatory UUID jako identyfikatory podmiotów. https://github.com/ramsey/uuid to dość solidna biblioteka do generowania ich, a https://github.com/ramsey/uuid-doctrine zapewnia implementację typu doktryny, która działa dobrze. – timdev

Powiązane problemy