Doctrine orm 如何转换保留其id的实体

Doctrine orm 如何转换保留其id的实体,doctrine-orm,single-table-inheritance,class-table-inheritance,Doctrine Orm,Single Table Inheritance,Class Table Inheritance,有一些实体(地区、国家、城市)使用了CTI(甚至CTI)。如何将Country转换为City并保留旧id?这在原则2中不受支持,因为PHP不支持类型转换用户对象 也就是说,条令使用鉴别器列来确定要水合的对象的类型。如果使用SQL更新更改数据库中鉴别器列的值,则下次加载对象时将更改对象类型。这适用于STI,但CTI将更加复杂。根据标准使用原则,这可能是不可能的,但您可以解决它。 如果使用类元数据,则可以选择鉴别器列 看看我为解决我的应用程序中的问题而创建的特性: namespace App\Doc

有一些实体(地区、国家、城市)使用了CTI(甚至CTI)。如何将Country转换为City并保留旧id?

这在原则2中不受支持,因为PHP不支持类型转换用户对象


也就是说,条令使用鉴别器列来确定要水合的对象的类型。如果使用SQL更新更改数据库中鉴别器列的值,则下次加载对象时将更改对象类型。这适用于STI,但CTI将更加复杂。

根据标准使用原则,这可能是不可能的,但您可以解决它。 如果使用类元数据,则可以选择鉴别器列

看看我为解决我的应用程序中的问题而创建的特性:

namespace App\Doctrine\Repository;

trait DiscriminatorTrait
{
    abstract public function getClassMetadata();

    abstract public function getEntityManager();

    private function updateDiscriminatorColumn($id, $class)
    {
        $classMetadata = $this->getClassMetadata();

        if (!in_array($class, $classMetadata->discriminatorMap)) {
            throw new \Exception("invalid discriminator class: " . $class);
        }

        $identifier = $classMetadata->fieldMappings[$classMetadata->identifier[0]]["columnName"];

        $column = $classMetadata->discriminatorColumn["fieldName"];
        $value = array_search($class, $classMetadata->discriminatorMap);

        $connection = $this->getEntityManager()->getConnection();

        $connection->update(
            $classMetadata->table["name"],
            [$column => $value],
            [$identifier => $id]
        );
    }
}
不过,我必须警告您,当您的子类有(很多)额外字段时,您需要在以后手动填充或清除它们