Як я можу отримати останній вставний ідентифікатор за допомогою доктрини 2 ORM? Я не знайшов цього в документації доктрини, чи можливо це взагалі?
Відповіді:
Мені довелося використовувати це після змиву, щоб отримати останній ідентифікатор вставки:
$em->persist($user);
$em->flush();
$user->getId();
persist()
сутність в циклі і flush()
після цього? Я намагаюся це зрозуміти, але поки що не везе.
code
$ id = $ user-> getId (); code
Ви можете отримати доступ до ідентифікатора після виклику методу persist менеджера сутності.
$widgetEntity = new WidgetEntity();
$entityManager->persist($widgetEntity);
$entityManager->flush();
$widgetEntity->getId();
Ви дійсно повинні флеш, щоб отримати цей ідентифікатор.
Виправлення помилки синтаксису: Додано крапку з комою після виклику $ entityManager-> flush ().
Якщо ви використовуєте не сутності, а власний SQL, як показано тут, ви можете отримати останній вставлений ідентифікатор, як показано нижче:
$entityManager->getConnection()->lastInsertId()
Для баз даних із послідовностями, таких як PostgreSQL, зверніть увагу, що ви можете вказати ім'я послідовності як перший параметр lastInsertId
методу.
$entityManager->getConnection()->lastInsertId($seqName = 'my_sequence')
Для отримання додаткової інформації подивіться на код на GitHub тут і тут .
lastInsertId('articles_id_seq')
$conn = $this->getDoctrine()->getConnection();
$metadata = $em->getClassMetadata('\App\Entity\YourClass');
$seqName = $metadata->getSequenceName($conn->getDatabasePlatform());
Works :-)
Виклик flush () може потенційно додати багато нових сутностей, тому насправді не існує поняття "lastInsertId". Однак Doctrine заповнює поля ідентичності щоразу, коли вони генеруються, тому доступ до поля id після виклику флешу завжди буде містити ідентифікатор нещодавно "збереженої" сутності.
Тут я розміщую свій код, після того, як я наполягав на одному робочому дні для пошуку цього рішення.
Функція отримання останнього збереженого запису:
private function getLastId($query) {
$conn = $this->getDoctrine()->getConnection();
$stmt = $conn->prepare($query);
$stmt->execute();
$lastId = $stmt->fetch()['id'];
return $lastId;
}
Ще одна функція, яка викликає вищевказану функцію
private function clientNum() {
$lastId = $this->getLastId("SELECT id FROM client ORDER BY id DESC LIMIT 1");
$noClient = 'C' . sprintf("%06d", $lastId + 1); // C000002 if the last record ID is 1
return $noClient;
}
Більш просто: SELECT max(id) FROM client