2010-08-18 3 views
59

Как я могу получить последний идентификатор вставки с доктриной 2 ORM? Я не нашел этого в документации доктрины, разве это возможно?Получите последний идентификатор вставки с доктриной 2?

+0

попробуйте это, в конце вашей вставки верните id ... как return $ this-> id; – Manie

ответ

140

я должен был использовать это после промывки, чтобы получить последний вставки ID:

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

Не могу использовать его. Получение ошибки Вызов неопределенного метода Test \ Entity \ Test :: getId() в «Мой проект» –

+0

@ noobie-php Вам нужно определить публичный получатель для вашего Идентификатора (если он является приватным, как и должно быть) – cheesemacfly

+0

@cheesemacfly : Я уже разобрал это, эта ошибка генерируется (в моем сценарии), когда мы не можем выполнить флеш() по какой-либо причине, как только Flush() будет успешно запущен getID() начнет работать, предполагая, что getter и seters здесь не проблема –

9

Calling заподлицо() потенциально может добавить много новых объектов, поэтому там не на самом деле понятие «lastInsertId». Однако Doctrine будет заполнять поля идентификатора всякий раз, когда будет сгенерирован, поэтому доступ к полю id после вызова flush всегда будет содержать идентификатор вновь «сохраненного» объекта.

29

Вы можете получить доступ к id после вызова метода persist менеджера сущностей.

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

Вы сделать необходимости вымывать для того, чтобы получить этот идентификатор.

Исправление ошибки синтаксиса: добавлена ​​точка с запятой после вызова $ entityManager-> flush().

+6

Мне нужно было сбросить, чтобы вернуть значение. Сохранять было недостаточно, поскольку элементы фактически не записываются в базу данных до тех пор, пока вы не начнете флеш. –

3

Немного поздно ответить на вопрос. Но,

Если это база данных, MySQL

должен $doctrine_record_object->id работать, если AUTO_INCREMENT определен в базе данных и в вашем определении таблицы.

17

Если вы не используете объекты, но Native SQL, как показано here, то вы можете получить последний вставленный идентификатор, как показано ниже:

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

Для баз данных с последовательностями, такими как PostgreSQL пожалуйста, не то, что вы можете укажите имя последовательности в качестве первого параметра метода lastInsertId.

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

Для получения дополнительной информации посмотрите на код на GitHub here и here.

+0

Это может не работать с каждой СУБД. Например, он не работает с Postgres (из-за последовательностей) –

+0

Awesome !! Я часами искал этот маленький фрагмент. – MikeGA

+4

@ paul.ago Вам просто нужно знать имя последовательности, например: 'lastInsertId ('articles_id_seq')' – ChocoDeveloper