2010-08-18 5 views
59

Làm cách nào để có được id chèn cuối cùng với học thuyết 2 ORM? Tôi đã không tìm thấy điều này trong tài liệu hướng dẫn của giáo lý, điều này thậm chí có thể?Lấy id chèn cuối cùng với học thuyết 2?

+0

hãy thử điều này, khi kết thúc quá trình chèn của bạn, hãy trả lại id ... như trả về $ this-> id; – Manie

Trả lời

140

tôi đã sử dụng điều này sau khi tuôn ra để có được id chèn lần cuối:

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

Không thể sử dụng nó. Nhận lỗi Gọi đến phương thức chưa xác định Test \ Entity \ Test :: getId() trong "My Project" –

+0

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

+0

@cheesemacfly : Tôi đã sắp xếp lỗi này được tạo ra (trong kịch bản của tôi) khi chúng ta không thể flush() vì bất kỳ lý do nào, khi Flush() được thực thi thành công getID() bắt đầu làm việc, giả sử getter và setters không phải là vấn đề ở đây –

9

Gọi flush() có khả năng có thể thêm nhiều đơn vị mới, do đó thực sự isnt khái niệm "lastInsertId". Tuy nhiên Doctrine sẽ điền các trường nhận dạng bất cứ khi nào một được tạo ra, do đó truy cập vào 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".

29

Bạn có thể truy cập id sau khi gọi phương thức vẫn tồn tại của trình quản lý đối tượng.

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

Bạn do cần xóa để lấy 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 tuôn ra để 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 tuôn ra. –

3

Hơi muộn để trả lời câu hỏi. Nhưng,

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

nên $doctrine_record_object->id việc nếu AUTO_INCREMENT được định nghĩa trong cơ sở dữ liệu và trong định nghĩa bảng.

17

Nếu bạn không sử dụng các đơn vị nhưng SQL Native như here sau đó bạn có thể muốn nhận được id chèn vào cuối như hình dưới đây:

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

Đối với cơ sở dữ liệu với chuỗi như PostgreSQL xin vui lòng không mà bạn có thể cung cấp tên trình tự làm tham số đầu tiên của phương thức lastInsertId.

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

Để biết thêm thông tin hãy nhìn vào đoạn code trên GitHub herehere.

+0

Đ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) –

+0

Awesome !! Tôi đã dành hàng giờ để tìm đoạn mã nhỏ này. – MikeGA

+4

@ paul.ago Bạn chỉ cần biết tên của chuỗi, ví dụ: 'lastInsertId ('articles_id_seq')' – ChocoDeveloper