我设置我的symfony3应用程序以使用2个不同的数据库。它们非常相似,表的结构是相同的,所以字段。问题是,例如,db1中的article表称为db1_article,db2中的article表称为db2_article。他们有不同的数据,但结构相同。
现在,我正在为这样的文章建立一个实体:
/**
* @ORM\Entity
* @ORM\Table(name="db1_article")
*/
class Article {
...
}
我不想在db2中为同一个表创建不同的实体,我可以在某处以某种方式定义表名以避免重复吗?
感谢
答案 0 :(得分:2)
为了更改表格,您必须更新该实体的Doctrine类元数据。
// getEntityManager() = $this->getDoctrine()->getManager()
$articleMetaData = $this->getEntityManager()->getMetadataFactory()->getMetadataFor(Article::class);
$metaDataBuilder = new ClassMetadataBuilder($articleMetaData);
$metaDataBuilder->setTable('db2_article');
$this->getEntityManager()->getMetadataFactory()
->setMetadataFor(Article::class, $metaDataBuilder->getClassMetadata());
$article2MetaData = $this->getEntityManager()->getClassMetadata(Article::class);
$article2MetaData->getTableName(); // is now db2_article
$this->getEntityManager()->find(Article::class, 1); // will query db2_article ID -> 1
要查看类元数据的方法,请参阅:Doctrine PHP Mapping
答案 1 :(得分:0)
我会为每个数据库使用不同的实体管理器,因此您可以使用相同的实体。
//config.yml
doctrine:
dbal:
default_connection: first_entity_manager
connections:
first_entity_manager:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
second_entity_manager:
driver: %database_2nd_driver%
host: %database_2nd_host%
port: %database_2nd_port%
dbname: %database_2nd_name%
user: %database_2nd_user%
password: %database_2nd_password%
charset: UTF8
orm:
default_entity_manager: first_entity_manager
entity_managers:
first_entity_manager:
connection: first_entity_manager
mappings:
AppBundle: ~
second_entity_manager:
connection: second_entity_manager
mappings:
AppBundle: ~
然后只编写一些函数来使用正确的实体管理器
$em_first = $this->getDoctrine()->getManager('first_entity_manager');
$em_second = $this->getDoctrine()->getManager('second_entity_manager');
$article_first_em = $em_first->getRepository('AppBundle:Article')->find(1);
$article_second_em = $em_second->getRepository('AppBundle:Article')->find(2);
对于表前缀,我会使用表suscriber
相当陈旧但仍然有效 How to setup table prefix in symfony2 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/sql-table-prefixes.html