Doctrine orm 运行时交换表
通常,使用条令实现实体时,会将其显式映射到表:Doctrine orm 运行时交换表,doctrine-orm,Doctrine Orm,通常,使用条令实现实体时,会将其显式映射到表: <?php /** * @Entity * @Table(name="message") */ class Message { //... } 令人惊讶的是(对我来说),解决方案非常简单。您只需获取实体的名称并更改其映射到的表的名称: /** @var EntityManager $em */ $class = $em->getClassMetadata('Message'); $class->setPrimary
<?php
/**
* @Entity
* @Table(name="message")
*/
class Message
{
//...
}
令人惊讶的是(对我来说),解决方案非常简单。您只需获取实体的名称并更改其映射到的表的名称:
/** @var EntityManager $em */
$class = $em->getClassMetadata('Message');
$class->setPrimaryTable(['name' => 'message_23']);
您需要小心,在加载了一些类型为Message
的实体并对其进行了更改之后,不要更改表名。如果幸运的话,它很有可能在保存时产生SQL错误(例如,由于表约束),或者修改错误的行(从新表)
我建议采用以下工作流程:
设置所需的表名李>
加载一些实体李>
随意修改,李>
拯救他们李>
将它们与实体管理器分离(该方法是重新开始的快速方法)李>
返回到步骤1(即使用另一张表重复)
即使不更改或不保存实体,步骤5(从实体管理器分离实体)也很有用。它允许实体管理器使用更少的内存并更快地工作
这只是可以用来动态设置/更改映射的许多方法之一。让我们来看看其余的。您可以在的文档页面中找到更多灵感。您是否阅读过?对我来说,你的情况听起来非常适合映射超类。我必须看一看……在过去的几个月里,我已经通篇阅读了文档,我确信,但我想不起这个功能。谢谢:)不幸的是,我不相信这是我想要的解决方案。有问题的表是由商业智能服务器自动创建的。模式相同,但数据大不相同。基本上,我需要一个“实体”类,它可以映射到交替命名的表、外键等。为此,我将研究使用您推荐的方法:)