Jim*_*mmy 10 database class-table-inheritance doctrine-orm
如何(如果可能的话)使用Doctrine2更改实体类型,使用它的类表继承?
比方说,我有一个Person
父类类型和两个继承类型Employe
和Client
.我的系统允许创建一个Person并指定它的类型 - 这很容易实现 - 但我也希望能够将人员从Employe更改为Client,同时保持-level Person
信息(它的id和其他相关联记录).
使用Doctrine2有一个简单的方法吗?
我昨天也在寻找这种行为.
最后,在与freenode上#doctrine的人交谈后,我被告知这是不可能的.
如果你想这样做,那么你必须经历这个:
Employee
表中为此继承创建相应的行.同样,如果你想删除继承,你必须..
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 实体。
归档时间: |
|
查看次数: |
2878 次 |
最近记录: |