2010-08-18 8 views

Odpowiedz

140

musiałem użyć tego po przypływie dostać ostatnią insert ID:

$em->persist($user); 
$em->flush(); 
$user->getId(); 
+2

Cant go używać. Uzyskiwanie błędu Wywołanie niezdefiniowanej metody Test \ Entity \ Test :: getId() w "Mój projekt" –

+0

@ noobie-php Musisz zdefiniować publiczny getter dla swojego identyfikatora (jeśli ten jest prywatny, tak jak powinien być) – cheesemacfly

+0

@cheesemacfly : Już to posortowałem, ten błąd jest generowany (w moim scenariuszu), kiedy nie możemy spłukać() z jakiegokolwiek powodu, gdy funkcja Flush() zostanie pomyślnie wykonana getID() zaczyna działać, zakładając, że getter i setery nie są tu problemem –

9

Wywołanie flush() może potencjalnie dodać wiele nowych jednostek, więc nie ma zbyt naprawdę pojęcie „lastInsertId”. Jednak Doctrine zapełni pola tożsamości za każdym razem, gdy zostanie wygenerowany, więc uzyskanie dostępu do pola id po wywołaniu flush zawsze będzie zawierało identyfikator nowo "utrwalonego" obiektu.

29

Możesz uzyskać dostęp do id po wywołaniu metody persist menedżera encji.

$widgetEntity = new WidgetEntity(); 
$entityManager->persist($widgetEntity); 
$entityManager->flush(); 
$widgetEntity->getId(); 

Robisz potrzeby spłukiwania w celu uzyskania z tego identyfikatora.

Błąd poprawek składni: Dodano średnik po wywołaniu metody $ entityManager-> flush().

+6

Musiałem spłukać, aby odzyskać wartość. Trwałość nie była wystarczająca, ponieważ przedmioty nie są zapisywane do bazy danych, dopóki nie spłukacie. –

3

Trochę za późno, aby odpowiedzieć na pytanie. Ale

Jeśli jest to baza danych MySQL

powinny $doctrine_record_object->id praca jeśli AUTO_INCREMENT jest zdefiniowana w bazie danych oraz w definicji tabeli.

17

Jeśli nie używasz składowych, lecz Native SQL jak pokazano here następnie możesz uzyskać ostatni zapisany identyfikator, jak pokazano poniżej:

$entityManager->getConnection()->lastInsertId() 

Dla baz danych z sekwencjami, takich jak PostgreSQL proszę nie, że można podać nazwę sekwencji jako pierwszy parametr metody lastInsertId.

$entityManager->getConnection()->lastInsertId($seqName = 'my_sequence') 

Aby uzyskać więcej informacji spojrzeć na kod na GitHub here i here.

+0

To może nie działać z każdym systemem DBMS. Na przykład nie działa z Postgresem (z powodu sekwencji) –

+0

Awesome !! Spędziłem godziny szukając tego małego fragmentu. – MikeGA

+4

@ paul.ago Musisz tylko znać nazwę sekwencji, np .: 'lastInsertId ('articles_id_seq') – ChocoDeveloper