2012-05-07 19 views
10

Có cách nào để lấy ID tổ chức trước khi lưu/xóa không? Ý tôi là:Doctrine2 - Nhận ID pháp nhân trước khi tuôn ra

$entity = new PointData(); 
$form = $this->createForm(new PointDataType(), $entity); 

Nếu tôi cố gắng $ entity-> getId() vào thời điểm này, nó sẽ trả gì cả.

tôi có thể lấy nó làm việc bằng cách:

$em->persist($entity); 
$em->flush(); 

(giả $ em = $ this-> getDoctrine() -> getEntityManager();)

Làm thế nào tôi có thể đạt được điều này?

+0

đọc về [chiến lược thế hệ nhận dạng] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifiers-primary- trên các trang tài liệu của Doctrine. – Crozin

+0

Cảm ơn bạn Crozin. Tôi đã đọc tất cả nội dung đó. Tôi không cố gắng để có được chỉ số tự động tiếp theo. Nó sẽ thất bại nếu 2 người dùng gọi hành động đó cùng một lúc. – Xavi

Trả lời

23

Nếu bạn muốn biết ID của một thực thể trước khi nó được lưu giữ trong cơ sở dữ liệu, thì rõ ràng bạn không thể sử dụng số nhận dạng được tạo. Bạn sẽ cần phải tìm cách nào đó để tạo ra các định danh duy nhất cho mình (có lẽ một số loại hàm băm có thể tạo ra các giá trị đủ duy nhất).

Điều này hiếm khi là một ý tưởng hay, vì vậy bạn nên cẩn thận.

Tôi sẽ suy nghĩ kỹ về lý do tại sao tôi cần phải biết số nhận dạng trước khi xóa. Doctrine là khá tốt cho phép bạn xây dựng một đồ thị đối tượng lớn, và kiên trì/tuôn ra tất cả cùng một lúc. Có vẻ như bạn có thứ gì đó xấu xí trong kiến ​​trúc mà bạn đang cố gắng làm việc. Nó có thể là một ý tưởng tốt để xem xét rằng trước khi đi xuống các tuyến ứng dụng tạo ra id.

+0

Cảm ơn bạn rất nhiều vì đã trả lời. – Xavi

+0

Có lẽ bạn có thể sử dụng UUID cho tác vụ này, vì chúng thực tế là duy nhất (https://en.wikipedia.org/wiki/Universally_unique_identifier) ​​và chúng có thể được tạo trước, từ PHP chẳng hạn. Tôi không thích chúng nhiều, nhưng sẽ là một giải pháp tốt. – JorgeeFG

+1

@JorgeeFG - Tuyệt đối. UUID là một điều tuyệt vời cho trường hợp sử dụng này. Trong những năm kể từ khi tôi viết câu trả lời này, tôi đã bắt đầu thích UUID làm định danh cho các thực thể. https://github.com/ramsey/uuid là một thư viện khá vững chắc để tạo chúng, và https://github.com/ramsey/uuid-doctrine cung cấp một triển khai kiểu học thuyết hoạt động tốt. – timdev