如何在Doctrine2 CTI继承中更改和实体类型

Jim*_*mmy 10 database class-table-inheritance doctrine-orm

如何(如果可能的话)使用Doctrine2更改实体类型,使用它的类表继承?

比方说,我有一个Person父类类型和两个继承类型EmployeClient.我的系统允许创建一个Person并指定它的类型 - 这很容易实现 - 但我也希望能够将人员从Employe更改为Client,同时保持-level Person信息(它的id和其他相关联记录).

使用Doctrine2有一个简单的方法吗?

Lay*_*yke 6

我昨天也在寻找这种行为.

最后,在与freenode上#doctrine的人交谈后,我被告知这是不可能的.

如果你想这样做,那么你必须经历这个:

升级用户

  1. 抓住人员实体.
  2. 更新discrimator列,使其不再是"person"并将其更改为"employee"
  3. 在您的Employee表中为此继承创建相应的行.

删除继承

同样,如果你想删除继承,你必须..

  1. 抓住人员实体.
  2. 更新discriminimnator列,使其不再是"员工"并将其更改为"人员".
  3. 删除Employee表格中的相应行.(是的,你必须删除它,只是更改discrimator coumn是不够的).

这可能会延迟7个月,但对于其他任何想要支持此类功能的内容来说,这至少是正确的答案.


小智 5

PHP 不支持对象转换,因此 Doctrine 也不支持它。为了解决这个问题,我将此静态方法写入父类中:

public static function castToMe($obj) {

    $class = get_called_class();
    $newObj = New $class();

    foreach (get_class_vars(get_class($newObj)) as $property => $value) {
        if (method_exists($obj, 'get' . ucfirst($property)) && method_exists($newObj, 'set' . ucfirst($property))) {
            $newObj->{'set' . ucfirst($property)}($obj->{'get' . ucfirst($property)}());
        }
    }

    return $newObj;
}
Run Code Online (Sandbox Code Playgroud)

您可以在类 Person 中创建此方法,并使用它从 Employe 转换为 Client,反之亦然:

$employe = New Employe();
$client = Client::castToMe($employe);
Run Code Online (Sandbox Code Playgroud)

现在,如果您愿意,您可以删除 $employe 实体。