如何以编程方式更改symfony2-doctrine中的表前缀



我将我的symfony3应用程序设置为使用2个不同的数据库。 它们非常相似,表的结构相同,字段也是如此。问题是,例如,db1 中的文章表称为 db1_article,而 db2 中的文章表称为 db2_article。它们具有不同的数据,但结构相同。

现在,我正在为这样的文章设置一个实体:

/**
* @ORMEntity
* @ORMTable(name="db1_article")
*/
class Article {
...
}

我不想在 db2 中为同一个表创建不同的实体,我可以在某处动态定义表名以避免重复吗?

谢谢

为了更改表格,您必须更新该实体的 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

要查看类元数据在方法中的作用,请参阅: 原则 PHP 映射

我会选择一种为每个数据库使用不同实体管理器的方法,这样您就可以使用相同的实体。

//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);

对于表前缀,我会使用表覆盖器

很旧,但仍然有效如何在symfony2中设置表前缀http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/sql-table-prefixes.html

相关内容

  • 没有找到相关文章

最新更新