我有一个实体A,其与B的关系为ManyToOne,但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/1反射异常:类 FQCN\Of\MyBundle\Entity\B 不存在...
"我知道它不存在,伙计,我想让你看看现在的好地方:比如在FQCN\Of\MyOtherBundle\Entity\B"
如何强制路径到我的实体"B"?
如果您的架构位于同一数据库中,则只需将实体的表定义为
BundleEntityClass:
type: entity
table: schema.class
(亚姆)
无需指定第二个连接。 当显式指示架构时,这些联接在原则 2 中完美运行。
如果您的架构位于不同的数据库中,您将面临一些痛苦,因为每个联接都将查询两个数据库;对于多个记录联接,每个条目将执行一个联接,这意味着您执行的查询数与结果集中的对象数成比例 (BAD)。
问题解决了!它与数据库模式或注释完全无关。
在实体 A 中,我的一个个人设置者强制输入参数:
public function setB(B $objB) { //... }
。我忘了使用B的FQCN!这就是为什么它使用A的。
下次我不会在注释中声明FQCN,以迫使我在课程开始时使用它! :)