Làm cách nào để lấy id chèn cuối cùng với ORM học thuyết 2? Tôi không tìm thấy điều này trong tài liệu học thuyết, liệu điều này có khả thi không?
Câu trả lời:
Tôi đã phải sử dụng điều này sau khi xả để có được id chèn cuối cùng:
$em->persist($user);
$em->flush();
$user->getId();
persist()
là thực thể trong một vòng lặp và flush()
sau đó? Tôi đang cố gắng tìm ra điều đó, nhưng không có may mắn cho đến nay.
code
$ id = $ user-> getId (); code
Bạn có thể truy cập id sau khi gọi phương thức duy trì của trình quản lý thực thể.
$widgetEntity = new WidgetEntity();
$entityManager->persist($widgetEntity);
$entityManager->flush();
$widgetEntity->getId();
Bạn làm cần phải tuôn ra để có được id này.
Sửa lỗi cú pháp: Đã thêm dấu chấm phẩy sau khi $ entityManager-> flush () được gọi.
Nếu bạn không sử dụng các thực thể mà là SQL gốc như được hiển thị ở đây thì bạn có thể muốn lấy id được chèn cuối cùng như được hiển thị bên dưới:
$entityManager->getConnection()->lastInsertId()
Đối với cơ sở dữ liệu có chuỗi như PostgreSQL, vui lòng lưu ý rằng bạn có thể cung cấp tên chuỗi làm tham số đầu tiên của lastInsertId
phương thức.
$entityManager->getConnection()->lastInsertId($seqName = 'my_sequence')
Để biết thêm thông tin, hãy xem mã trên GitHub tại đây và tại đây .
lastInsertId('articles_id_seq')
$conn = $this->getDoctrine()->getConnection();
$metadata = $em->getClassMetadata('\App\Entity\YourClass');
$seqName = $metadata->getSequenceName($conn->getDatabasePlatform());
Công trình :-)
Việc gọi flush () có khả năng thêm nhiều thực thể mới, vì vậy không thực sự có khái niệm "lastInsertId". Tuy nhiên, Doctrine sẽ điền vào các trường danh tính bất cứ khi nào một trường được tạo, vì vậy việc truy cập trường id sau khi gọi flush sẽ luôn chứa ID của một thực thể mới "tồn tại".
Ở đây tôi đăng mã của mình, sau khi tôi đã cố gắng trong một ngày làm việc để tìm ra giải pháp này.
Chức năng lấy bản ghi đã lưu cuối cùng:
private function getLastId($query) {
$conn = $this->getDoctrine()->getConnection();
$stmt = $conn->prepare($query);
$stmt->execute();
$lastId = $stmt->fetch()['id'];
return $lastId;
}
Một Hàm khác gọi hàm trên
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;
}
Đơn giản hơn: SELECT max(id) FROM client