2012-07-13 4 views
16

Tôi tự hỏi liệu có thể tạo mối quan hệ giữa hai thực thể nằm trong cơ sở dữ liệu riêng biệt hay không.Sử dụng mối quan hệ với nhiều người quản lý thực thể

Ví dụ: nếu chúng tôi lấy giải pháp được tìm thấy ở đây http://symfony.com/doc/current/cookbook/doctrine/multiple_entity_managers.html và tạo mối quan hệ một đến nhiều với Người dùng trong cơ sở dữ liệu khách hàng thành Bài đăng trong cơ sở dữ liệu mặc định.

Đây có phải là thứ được hỗ trợ bởi Symfony2 và Doctrine không?

Trả lời

25

Sử dụng các trình quản lý đối tượng khác nhau (trình quản lý đối tượng) không cho phép biểu đồ đối tượng giao nhau. Trường hợp đó quá phức tạp và không được quản lý bởi Doctrine ORM.

Nếu bạn cần trường hợp như vậy, hãy giữ biểu đồ đối tượng bị ngắt kết nối bằng cách lưu số nhận dạng của các đối tượng liên quan (kiểu cũ) thay vì tham chiếu đến chúng, sau đó lấy đối tượng qua dịch vụ theo cách thủ công. Bạn có thể tìm thấy một ví dụ khá tốt về cách thức này sẽ hoạt động trong một example of connection between Doctrine2 ORM and Doctrine2 MongoDB ODM. Ngoài ra, bạn cũng có thể sử dụng trình nghe sự kiện @PostLoad để điền dữ liệu vào các thực thể của mình bằng cách tạo liên kết thông qua các kho lưu trữ mà tôi đã liên kết trong ví dụ. Tương tự cho @PostPersist (mà thay vào đó sẽ trích xuất các định danh cho các đối tượng liên quan), nhưng hãy cẩn thận rằng kỹ thuật này có thể trở nên thực sự lộn xộn.

Ngoài ra, nếu RDBMS của bạn hỗ trợ các hoạt động trên cơ sở dữ liệu trên một máy chủ, bạn chỉ có thể sử dụng một EntityManager và tham khảo bảng khác với @ORM\Table(name="schemaname.tablename").

+6

* nếu RDBMS của bạn hỗ trợ các hoạt động trên cơ sở dữ liệu trên một máy chủ duy nhất, bạn chỉ có thể sử dụng một EntityManager đơn lẻ và tham khảo bảng khác *. Lời khuyên tuyệt vời. Cảm ơn! – noisebleed

+2

Phát hiện ra rằng Doctrine chỉ phát hiện các thay đổi lược đồ trong các bảng 'default_connection', khi chỉ sử dụng một trình quản lý thực thể và nhiều cơ sở dữ liệu. Bất kỳ ý tưởng để workaround này? – noisebleed

+1

@noisebleed từ tài liệu: $ php ứng dụng/giao diện điều khiển học thuyết: lược đồ: cập nhật --force --em = khách hàng. đọc thêm tại đây: http://symfony.com/doc/current/cookbook/doctrine/multiple_entity_managers.html – apfz