有一些实体(地区、国家、城市)使用STI(甚至 CTI)。如何将 Country 转换为 City 留下旧 ID?
问问题
829 次
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 回答