3

STI(またはCTI)を使用したエンティティ(地域、国、都市)がいくつかあります。古いIDを残して国を都市に変換するにはどうすればよいですか?

4

2 に答える 2

4

型キャストユーザーオブジェクトはPHPでサポートされていないため、これはDoctrine2ではサポートされていません。

そうは言っても、Doctrineはディスクリミネーター列を使用して、水和するオブジェクトのタイプを決定します。データベースのディスクリミネータ列の値をSQLUPDATEで変更すると、次にオブジェクトがロードされたときにオブジェクトタイプが変更されます。これはSTIで機能しますが、CTIはもっと複雑になります。

于 2011-06-13T19:12:41.523 に答える
0

Doctrineを使用する標準では不可能かもしれませんが、回避することはできます。クラスメタデータを使用する場合は、ディスクリミネーター列を選択できます。

アプリ内の問題を解決するために作成したトレイトを見てください。

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 に答える