如何使用多个数据库模式管理 Doctrine 查询
Posted
技术标签:
【中文标题】如何使用多个数据库模式管理 Doctrine 查询【英文标题】:How to manage Doctrine queries with multiple db schemas 【发布时间】:2012-12-05 22:57:29 【问题描述】:我有一个实体 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/1ReflectionException:FQCN\Of\MyBundle\Entity\B 类不存在...
“我知道它不存在,伙计,我想让你看看现在的好地方:比如在 FQCN\Of\MyOtherBundle\Entity\B”
如何强制路径指向我的实体“B”?
【问题讨论】:
【参考方案1】:如果您的架构在同一个数据库中,那么只需将实体的表定义为
Bundle\Entity\Class:
type: entity
table: schema.class
(yaml)
您无需指定第二个连接。当明确指出模式时,这些连接在原则 2 中完美运行。
如果您的架构位于不同的数据库中,您会遇到一些麻烦,因为每个连接都会查询两个数据库;对于多个记录连接,每个条目都将执行连接,这意味着您执行的查询数量与结果集中的对象数量成正比 (BAD)。
【讨论】:
我的课程:namespace FQCN\Of\MyBundle\Entity; /** * @ORM\Table(name="SCHEMA1.TABLE_1") * @ORM\Entity(repositoryClass="FQCN\Of\MyBundle\Repository\ARepository") */ class A /** * @ORM\ManyToOne(targetEntity="FQCN\Of\MyOtherBundle\Entity\B") * @ORM\JoinColumn(name="...", referencedColumnName="..."), */ private $b; namespace FQCN\Of\MyOtherBundle\Entity; /** * @ORM\Table(name="SCHEMA2.TABLE_2") * @ORM\Entity(repositoryClass="FQCN\Of\MyOtherBundle\Repository\BRepository") */ class B
Dump A => 类 FQCN\Of\MyBundle\Entity\B 不存在。
Arg 对不起,我没有解决这个缩进废话。无论如何,我在注释中添加了模式名称,并且只使用一个连接。它仍然使用错误的 FQCN 搜索我的实体 B:/ 但我 100% 确定在注释中定义了好的。我只得到一个带有存储库的对象 ->find();然后 Debug::dump 它。就在此时,我遇到了错误:Dump A => "Class FQCN\Of\MyBundle\Entity\B 不存在。"这是错误的 FQCN。【参考方案2】:
问题解决了!它与数据库架构或注释完全无关。
在实体 A 中,我的一个个人设置器强制输入参数:
public function setB(B $objB) //...
...我忘记使用 B 的 FQCN 了!这就是它使用 A 的原因。
下次我不会在注释中声明 FQCN 来强制我在课程开始时使用它! :)
【讨论】:
以上是关于如何使用多个数据库模式管理 Doctrine 查询的主要内容,如果未能解决你的问题,请参考以下文章
有人可以建议一种使用带有多个“where”子句的 Doctrine (QueryBuilder) 进行此查询的方法吗?