Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何在symfony2原则中以编程方式更改表前缀_Database_Doctrine Orm_Symfony - Fatal编程技术网

Database 如何在symfony2原则中以编程方式更改表前缀

Database 如何在symfony2原则中以编程方式更改表前缀,database,doctrine-orm,symfony,Database,Doctrine Orm,Symfony,我将symfony3应用程序设置为使用2个不同的数据库。它们非常相似,表的结构相同,因此字段也相同。例如,问题是,db1中的article表称为db1_article,db2中的article表称为db2_article。它们有不同的数据,但结构相同 现在,我正在为这样的文章建立一个实体: /** * @ORM\Entity * @ORM\Table(name="db1_article") */ class Article { ... } 我不希望在db2中为同一个表创建不同的实体,我可以在某

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

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

/**
* @ORM\Entity
* @ORM\Table(name="db1_article")
*/
class Article {
...
}
我不希望在db2中为同一个表创建不同的实体,我可以在某个地方定义表名以避免重复吗


谢谢

为了更改表,您必须更新该实体的条令类元数据

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

要查看类元数据在方法中的用途,请参阅:

我将选择一种方法,对每个数据库使用不同的实体管理器,以便您可以使用相同的实体

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

很老了,但仍然有效

我认为这是不可能的。在调用
$em->persist($article)
时,条令如何知道要使用哪个表名?我猜可能有一种方法可以指定不在注释中的表名?您可以使用两个实体管理器,每个管理器都有一组不同的映射文件。注释不起作用。还有一种称为信条元类的东西,它存储所有映射数据。虽然我不知道细节,但我认为可以更改表名。在Doctrine文档中浏览一下。谢谢你,这是有效的,即使我仍然试图从模型而不是从控制器使其工作。谢谢