如何使用多个数据库模式管理Doctrine查询

时间:2012-12-18 17:06:38

标签: php symfony doctrine-orm doctrine-query

我有一个实体A,其关系是ManyToOne与B,但A和B不属于同一个数据库模式。

实体'A'属于MyBundle包,实体'B'属于MyOtherBundle包。

官方文档说明了如何使用不同的连接:多个模式=多个实体管理器。但就我而言,我想加入两个实体。

通过做:

$this->objEm->getRepository('MyBundle:MyEntity')->find($id);

$this->objEm->getRepository('MyBundle:MyEntity')->getMyResult($id);

我只调用我的一个存储库,我猜他无法获得另一个存储库,因为在我的config.yml中我只能选择一个连接。

doctrine:
  dbal:
   connections:
     connection1:
       driver:   "%database_driver%"
       host:     "%database_host%"
       port:     "%database_port%"
       dbname:   "%database_name%"
       user:     "%database_schema1_user%"
       password: "%database_schema1_password%"
       service:  "%database_service%"
       charset:  "Windows-1252"
     connection2:
       driver:   "%database_driver%"
       host:     "%database_host%"
       port:     "%database_port%"
       dbname:   "%database_name%"
       user:     "%database_schema2_user%"
       password: "%database_schema2_password%"
       service:  "%database_service%"
       charset:  "Windows-1252"

orm:
  entity_managers:
    em1:
      connection:       connection1
      mappings:
              MyBundle: ~
              MyOtherBundle: ~
    em2:
      connection:       connection2
      mappings:
              MyOtherBundle: ~

结果:糟糕,看起来出了问题。

1 / 1ReflectionException:类FQCN \ Of \ MyBundle \ Entity \ B不存在...

“我知道它不存在,我希望你现在看看好地方:比如在FQCN \ Of \ MyOtherBundle \ Entity \ B”

如何强制实体'B'的路径?

2 个答案:

答案 0 :(得分:3)

如果您的架构位于同一个数据库中,那么只需将实体的表定义为

即可
Bundle\Entity\Class:
    type: entity
    table: schema.class

(YAML)

您无需指定第二个连接。当明确指出架构时,这些连接在原则2中完美地工作。

如果您的架构位于不同的数据库中,那么您会遇到一些不幸,因为每个连接都将查询这两个数据库;对于多记录连接,每个条目将执行连接,这意味着您执行与结果集(BAD)中的对象数量成比例的多个查询。

答案 1 :(得分:2)

问题解决了!它与数据库模式和注释完全无关。

在实体A中,我的一个人员设置器强制输入参数:

public function setB(B $objB) { //... }

......我忘了使用B的FQCN!这就是它使用A的原因。

下次我不会在注释中声明FQCN,迫使我在课程开始时使用它! :)