通常,当您使用 Doctrine 实现实体时,您会将其显式映射到表:
<?php
/**
* @Entity
* @Table(name="message")
*/
class Message
{
//...
}
或者您回复原则以隐式将您的类名映射到表...我有几个在架构上相同的表,但我不希望每次都重新创建该类...因此在运行时(动态地) )我想相应地更改表名称。
我从哪里开始或者我会考虑什么来实现这个奇怪的要求???
ClassMetadata
并更改它映射到的表的名称:
/** @var EntityManager $em */
$class = $em->getClassMetadata('Message');
$class->setPrimaryTable(['name' => 'message_23']);
您需要小心,在加载了一些
Message
类型的实体并更改它们后,不要更改表名称。如果幸运的话,它很可能会在保存时产生 SQL 错误(例如,由于表约束),否则它会修改错误的行(来自新表)。
我建议以下工作流程:
即使您不更改或不保存实体,步骤#5(从实体管理器中分离实体)也很有用。它允许实体管理器使用更少的内存并更快地工作。
这只是可用于动态设置/更改映射的众多方法之一。其余部分请查看 ClassMetadata 类的文档。您可以在PHP映射的文档页面中找到更多灵感。