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(从实体管理器分离实体)也很有用。它允许实体管理器使用更少的内存并更快地工作


    这只是可以用来动态设置/更改映射的许多方法之一。让我们来看看其余的。您可以在的文档页面中找到更多灵感。

    您是否阅读过?对我来说,你的情况听起来非常适合映射超类。我必须看一看……在过去的几个月里,我已经通篇阅读了文档,我确信,但我想不起这个功能。谢谢:)不幸的是,我不相信这是我想要的解决方案。有问题的表是由商业智能服务器自动创建的。模式相同,但数据大不相同。基本上,我需要一个“实体”类,它可以映射到交替命名的表、外键等。为此,我将研究使用您推荐的方法:)