Symfony2:如何在同一Bundle中从多个现有数据库生成实体?

8

我的目标是在一个项目捆绑包中访问多个数据库。

我阅读了symfony2文档并成功完成了以下操作:

  1. configure multiple connections for different Bundles
  2. generate Entities from ONE Existing Database using:

    php app/console doctrine:mapping:import AcmeBlogBundle annotation
    php app/console doctrine:generate:entities AcmeBlogBundle
    
我无法找到方法从同一Bundle中的多个现有数据库中生成实体,以便我可以在一个Bundle中访问多个数据库。有什么想法吗?
附言:我不熟悉Doctrine。所以实际上,如果有没有Doctrine的Symfony2的方法,我也会感激。
更新#1: Cerad's answer 很接近。但是还有一个问题没有解决。因为我在不同的数据库中有一些相同的表名,最好将它们组织成Entity文件夹内的单独文件夹。我已经查看了类似thisthat的帖子。但是这些解决方案对我不起作用。它们的解决方案只是直接将所有实体放入Entity文件夹中,忽略了config.yml中指定的dir选项。有没有解决这个问题的方法?
1个回答

6
第一步是配置多个实体管理器(而不是连接),每个数据库一个。然后,您使用doctrine命令的--em选项指定要使用的实体管理器。
php app/console doctrine:mapping:import "AcmeBlogBundle" annotation --em=name1
php app/console doctrine:mapping:import "AcmeBlogBundle" annotation --em=name2

需要注意的是,使用Doctrine时无法直接跨多个数据库查询(连接)。至少不是很容易。只要您计划一次仅限于一个数据库的查询,那么就没有问题。

实际上,这是一个相当高级的话题。您可能需要花些时间阅读Doctrine文档。最好先从一个数据库开始,然后再拆分。


谢谢您的回复。仍有一个问题未解决。由于我在不同的数据库中有一些相同的表名,因此最好将它们组织到 Entity 文件夹内的单独文件夹中。我已经查看了 https://dev59.com/L2vXa4cB1Zd3GeqPM89d,但似乎无法实现,这个问题有解决方法吗? - Capitaine
唯一的直接解决方法是将数据库名称添加到表名中。但这样做意味着各种Doctrine命令将停止工作,并且意味着硬编码数据库名称。根据您的需求,您可能可以使用SQL视图来基本上更改表名。我认为最好还是使用多个bundles。 - Cerad
1
你应该创建一个新的Symfony安装,生成一个bundle来拉取你的表格,然后编辑命名空间并将文件复制到现有的bundle中。虽然这样做比试图在映射生成器中绕过的方式更麻烦,但它更容易。你肯定可以在entity下拥有命名空间(我的项目中有好几个级别)。例如:Bundle/Entity/ThingsThatMakeMeMad/SpilledMilk.php等。 - james_t
感谢您的建议。如果同步Doctrine对象需要太多手动操作,那么我更喜欢使用简单的PHP MySQL连接命令来查询数据库。 - Capitaine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接