3

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

4

2 回答 2

4

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

话虽如此,Doctrine 使用鉴别器列来确定要水合的对象类型。如果使用 SQL UPDATE 更改数据库中鉴别器列的值,则对象类型将在下次加载对象时更改。这适用于 STI,但 CTI 会更复杂。

于 2011-06-13T19:12:41.523 回答
0

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

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

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]
        );
    }
}

不过,我确实必须警告您,当您的子类有(很多)额外字段时,您需要在之后手动填写或清除它们。

于 2019-02-18T15:23:00.760 回答