Lấy id chèn cuối cùng với học thuyết 2?


76

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?


hãy thử điều này, ở cuối phần chèn của bạn, hãy trả về id ... như return $ this-> id;
Manie

Câu trả lời:


178

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();

2
Không thể sử dụng nó. Gặp lỗi Cuộc gọi đến phương thức không xác định Test \ Entity \ Test :: getId () trong "Dự án của tôi"
noobie-php

@ noobie-php Bạn cần phải xác định một getter công cộng cho Id của bạn (nếu đây là tin như nó phải được)
cheesemacfly

@cheesemacfly: Tôi đã sắp xếp điều này và lỗi này được tạo ra (trong trường hợp của tôi) khi chúng tôi không thể xả () vì bất kỳ lý do gì, khi Flush () được thực thi thành công getID () bắt đầu hoạt động, giả sử getter và setters không phải là vấn đề ở đây
noobie-php

1
Điều gì sẽ xảy ra nếu tôi 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.
Nat Naydenova

gán id cho biến: code$ id = $ user-> getId (); code
Josiah

40

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.


6
Tôi đã phải xả để lấy lại giá trị. Kiên trì là không đủ, vì các mục không thực sự được ghi vào cơ sở dữ liệu cho đến khi bạn xóa.
Jeremy Hicks

29

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 lastInsertIdphươ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 đâytại đây .


Điều này có thể không hoạt động với mọi DBMS. Ví dụ: nó không hoạt động với Postgres (vì các chuỗi)
paul.ago

Tuyệt vời!! Tôi đã dành hàng giờ để tìm kiếm đoạn mã nhỏ này.
MikeGA

4
@ paul.ago Bạn chỉ cần biết tên của dãy số, ví dụ:lastInsertId('articles_id_seq')
ChocoDeveloper

1
Bạn cũng có thể có được tên của chuỗi như thế này: $conn = $this->getDoctrine()->getConnection(); $metadata = $em->getClassMetadata('\App\Entity\YourClass'); $seqName = $metadata->getSequenceName($conn->getDatabasePlatform());Công trình :-)
Hugues D

10

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".


2

Một chút muộn để trả lời câu hỏi. Nhưng,

Nếu đó là cơ sở dữ liệu MySQL

sẽ $doctrine_record_object->idhoạt động nếu AUTO_INCREMENTđược định nghĩa trong cơ sở dữ liệu và trong định nghĩa bảng của bạn.


0

Ở đâ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;
    }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.