Doctrine 在运行时交换表

问题描述 投票:0回答:1

通常,当您使用 Doctrine 实现实体时,您会将其显式映射到表:

<?php
/**
 * @Entity
 * @Table(name="message")
 */
class Message
{
    //...
}

或者您回复原则以隐式将您的类名映射到表...我有几个在架构上相同的表,但我不希望每次都重新创建该类...因此在运行时(动态地) )我想相应地更改表名称。

我从哪里开始或者我会考虑什么来实现这个奇怪的要求???

doctrine-orm
1个回答
2
投票

令我惊讶的是,解决方案非常简单。您所要做的就是获取实体的

ClassMetadata
并更改它映射到的表的名称:

/** @var EntityManager $em */
$class = $em->getClassMetadata('Message');
$class->setPrimaryTable(['name' => 'message_23']);

您需要小心,在加载了一些

Message
类型的实体并更改它们后,不要更改表名称。如果幸运的话,它很可能会在保存时产生 SQL 错误(例如,由于表约束),否则它会修改错误的行(来自新表)。

我建议以下工作流程:

  1. 设置所需的表名;
  2. 加载一些实体;
  3. 随意修改;
  4. 拯救他们;
  5. 将它们与实体管理器分离(方法 EntityManager::clear() 是重新开始的快速方法);
  6. 返回步骤 1(即使用另一个表重复)。

即使您不更改或不保存实体,步骤#5(从实体管理器中分离实体)也很有用。它允许实体管理器使用更少的内存并更快地工作。

这只是可用于动态设置/更改映射的众多方法之一。其余部分请查看 ClassMetadata 类的文档。您可以在PHP映射的文档页面中找到更多灵感。

© www.soinside.com 2019 - 2024. All rights reserved.