2012-02-16 24 views
12

tôi cố gắng làm việc với hai nhà quản lý thực thể cho bó cùng. Cấu hình của tôi giống như sau:Làm việc với hai nhà quản lý thực thể trong gói cùng trong Symfony2

orm: 

    default_entity_manager: default 
    entity_managers: 
     electra: 
      connection:  electra 
      mappings: 
       XXDemoBundle: ~ 
     default: 
      connection:  default 
      mappings: 
       XXDemoBundle: ~ 

Có cách nào để nói những quyền lợi thuộc về người quản lý thực thể nào không? Nó bây giờ đổ vỡ nếu tôi muốn làm việc với một bảng mà không thuộc về trình quản lý thực thể mặc định.

Cảm ơn

  • CẬP NHẬT

đây là cấu hình của tôi cho kết nối:

doctrine: 
    dbal: 
     default_connection:  default 
     connections: 
      default: 
       dbname:   old_project 
       user:    root 
       password:   123123 
       host:    1.1.1.1 
       port:    1 
      electra: 
       dbname:   electra 
       user:    root 
       password:   123123 
       host:    2.2.2.2 
       port:    2 

orm: 
    default_entity_manager: electra 
    entity_managers: 
     electra: 
      connection:  electra 
      mappings: 
       XXDemoBundle: ~ 


     default: 
      connection:  default 
      mappings: 
       XXDemoBundle: ~ 
+0

Xin vui lòng gửi một ví dụ đơn giản về những gì đang đâm. Cả hai kết nối của bạn đều trỏ đến cùng một cơ sở dữ liệu? Có vẻ như bạn cũng nên có auto_generate_proxy_classes trong đó và có thể auto_mapping nhưng có thể không. Hãy thử "php app/console doctrine: mapping: info --em" với câu lệnh đầu tiên, sau đó là trình quản lý thực thể khác. – Cerad

+0

Xin chào! Tôi sử dụng hai cơ sở dữ liệu khác nhau với hai kết nối khác nhau. Ánh xạ: thông tin nói rằng tôi không có thực thể nào được quản lý bởi trình quản lý thực thể mặc định, tất cả các thực thể của tôi được xử lý bởi electra. – gabrielthorn

+0

Điều đó có nghĩa là bạn có vấn đề về cấu hình ở đâu đó. Vui lòng đăng ánh xạ kết nối của bạn. doctrine: mapping: info sẽ trả về cùng một danh sách các thực thể cho cả hai ems. Đảm bảo bạn có dòng auto_generate và bạn đang làm việc trong chế độ phát triển. – Cerad

Trả lời

22

Đối với sử dụng nhiều EntityManager trong cùng một bó bạn phải cấu hình tùy chọn bản đồ cho mỗi EntityManager.

http://symfony.com/doc/current/reference/configuration/doctrine.html

dụ tắt tập tin cấu hình

 
doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      default: 
       driver: %database_driver% 
       host:  %database_host% 
       port:  %database_port% 
       dbname: %database_name% 
       user:  %database_user% 
       password: %database_password% 
       charset: UTF8 
      second: 
       driver: %database_sqlite_driver% 
       host:  ~ 
       port:  ~ 
       dbname: %database_sqlite_shop_name% 
       path:  %database_sqlite_shop_name% 
       user:  ~ 
       password: ~ 
       charset: UTF8 

    orm: 
     auto_generate_proxy_classes: %kernel.debug% 
     default_entity_manager: default 
     entity_managers: 
      default: 
       connection:  default 
       mappings: 
        YourBundle: 
         # you must specify the type 
         type:  "annotation"  
         # The directory for entity (relative to bundle path) 
         dir:  "Entity/FirstDb"   
         #the prefix 
         prefix: "Your\Bundle\Entity\FirstDb" 
      shop: 
       connection:  second 
       mappings: 
        YourBundle: 
         type: "annotation" 
         #here the second path where entity for the connection stand 
         dir: "Entity/SecondDb" 
         #the prefix 
         prefix: "Your\Bundle\Entity\SecondDb" 

Bây giờ bạn có thể sử dụng giao diện điều khiển để quản lý db của bạn với các thông số --em

Ex: cập nhật cơ sở dữ liệu cho các cửa hàng EntityManager

php app/console doctrine:schema:update --em=shop 

Đọc thông tin bản đồ từ Your \ Bundle \ En tity \ SecondDb

Ex: cập nhật cơ sở dữ liệu cho EntityManager mặc định

php app/console doctrine:schema:update 

thông tin bản đồ đọc từ bạn \ Bundle \ Entity \ FirstDb

+0

Cảm ơn. Câu trả lời của bạn chỉ hoạt động tốt. Nó phải được chấp nhận! – Heyfara

+0

Cảm ơn bạn và xin lỗi vì nhận xét muộn. – gabrielthorn

+1

Vì đây là một câu trả lời được chấp nhận, hãy chú ý rằng trong phiên bản mới hơn của Symfony bạn phải thoát khỏi dấu gạch chéo ngược trong tiền tố như sau: "Your \\ Bundle \\ Entity \\ SecondDb", nếu không nó không hoạt động. – tomazahlin

2

Ok. Đã cố gắng chỉnh sửa bài đăng gốc của bạn nhưng nó đang chờ xem xét ngang hàng. Không chắc là phải mất bao lâu. Hãy thử thay đổi cấu hình của bạn để:

doctrine: 
    dbal: 
     default_connection:  default 
     connections: 

     default: 
      dbname:   old_project 
      user:    root 
      password:   123123 
      host:    1.1.1.1 
      port:    1 

     # Make an explicit connection just for clarity 
     old_project: 
      dbname:   old_project 
      user:    root 
      password:   123123 
      host:    1.1.1.1 
      port:    1    

     electra: 
      dbname:   electra 
      user:    root 
      password:   123123 
      host:    2.2.2.2 
      port:    2 

    orm: 
     # Humor me and add these 
     auto_generate_proxy_classes: %kernel.debug% 
    # auto_mapping: true 

    default_entity_manager: electra 
    entity_managers: 

    # Make an explicit old_project em so default does not confuse us 
    old_project: 
     connection:  old_project 
     mappings: 
      XXDemoBundle: ~ 

    electra: 
     connection:  electra 
     mappings: 
      XXDemoBundle: ~ 


    default: 
     connection:  default 
     mappings: 
      XXDemoBundle: ~ 

Bây giờ hoàn toàn thổi bay cache của bạn chỉ để đảm bảo sau đó chạy:

php app/console doctrine:mapping:info --em electra 
php app/console doctrine:mapping:info --em old_project 

Bạn sẽ nhận được kết quả giống hệt nhau. Tôi đã thử nghiệm điều này trên hệ thống của tôi vì vậy tôi khá chắc chắn rằng nếu bạn không thì bạn có một số lỗi đánh máy ở đâu đó.

info Vì vậy, lập bản đồ đang làm việc. Bước tiếp theo là xác minh rằng cả hai cơ sở dữ liệu đều khớp với lược đồ thực thể của bạn. Vì vậy, hãy thực hiện điều này:

php app/console doctrine:schema:update --em electra --dump-sql 
php app/console doctrine:schema:update --em old_project --dump-sql 

Không được sản xuất bất kỳ đầu ra nào. Nếu có thì nó có nghĩa là cơ sở dữ liệu của bạn không phù hợp với các thực thể của bạn và cần được giải quyết (có thể sử dụng tùy chọn --force) trước khi các truy vấn sẽ hoạt động.

Một khi cơ sở dữ liệu được đồng bộ thì có thể bạn nên sử dụng học thuyết: truy vấn: DQL và làm một truy vấn thử nghiệm chống lại cả nhà quản lý. Sau đó quay lại mã của bạn.

=========================================

Nó bây giờ đã được hiểu rằng mục tiêu thực sự là có hai người quản lý thực thể trỏ đến cùng một tập hợp các thực thể nhưng bằng cách nào đó chỉ ra rằng mỗi người quản lý thực thể nên giới hạn chính nó vào một tập hợp nhất định của các thực thể đó. Và đó không phải là thứ mà S2 hỗ trợ ra khỏi hộp.

Bạn có thể xem xét thông qua hướng dẫn thuyết và xem cách nó xử lý siêu dữ liệu thực thể và có thể làm điều gì đó với điều đó nhưng điều đó có thể trở nên phức tạp.

Điều duy nhất mà S2 thực sự cung cấp là khả năng để ràng buộc một người quản lý tổ chức cho tất cả các thực thể trong một hoặc nhiều gói sử dụng thuộc tính bản đồ. Nếu bạn muốn chia sẻ nói ba trong bảy thực thể từ một gói với một gói khác thì bạn sẽ chỉ cần tạo lại các thực thể đó trong gói thứ hai. Có thể bằng cách mở rộng lớp để tránh trùng lặp mã.

Tôi nghĩ bạn có thể muốn thay đổi cách tiếp cận của bạn một chút. Nếu bạn có một tập hợp các thực thể cốt lõi được chia sẻ với nhiều nhóm thì hãy đặt các đối tượng đó vào nhóm của riêng chúng. Mỗi theo sau trên bó có thể thêm các thực thể bổ sung.

+0

Cập nhật câu trả lời của tôi với cấu hình mới để thử – Cerad

+0

Bây giờ, ánh xạ có vẻ tốt, tôi thấy cùng các thực thể cho hai người quản lý thực thể. Tuy nhiên, tôi nhận được cùng một lỗi bất cứ nơi nào tôi cố gắng truy cập một cái gì đó trong electra, nó nói: SQLSTATE [42S22]: Không tìm thấy cột: 1054 Cột không xác định 't0.country_code' trong 'danh sách trường' 500 Lỗi máy chủ nội bộ - PDOException bảng quốc gia nằm trong db electra, không phải bảng có kết nối mặc định – gabrielthorn

+0

Câu trả lời được cập nhật dựa trên thực tế là cả hai người quản lý đều thấy cùng một thực thể. – Cerad

Các vấn đề liên quan