0

次のエンティティがあるとします。

class Entity {
    protected $id;
}
class User extends Entity {
    /** @var Entity */
    protected $target;
}
class Document extends Entity {
    protected $title;
}
class Report extends Entity {
    protected $level;
}

User教義がエンティティを正しくマッピングできるように、どのマッピングを作成する必要がありますか? User::$targetここでの問題は、任意の Entityを使用できるようにしたい(したがって、型のヒント)、コードの後半で、それが aまたは aEntityであるかどうかに応じて、それに応じて応答できるようにすることです。DocumentReport

これはまた、コード内で、それが であるか、 であるかのいずれEntity::$titleかをフェッチできる必要があることを意味します。DocumentEntity::$levelReport

教義でこれを達成できますか?

4

1 に答える 1

1

これはうまくいくはずです。"@ORM\Entity" ( http://docs.doctrine-project.org/en/latest/reference/annotations-reference.html )のようなデフォルトの注釈は追加しませんでした。これがあなたが探しているものであることを願っています。

/**
 * @ORM\InheritanceType("SINGLE_TABLE")
 */
class Entity {
    protected $id;
}

class User extends Entity {
    /** 
     * @ORM\ManyToOne(targetEntity="Entity")
     * @var Entity 
     */
    protected $target;
}

以下をご覧ください: http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html パフォーマンスの問題により、クラス テーブル継承よりも単一継承を使用する必要があります。

それ以外の場合、Doctrine はエンティティ テーブルの子テーブルを結合します。これは、Doctrine が「エンティティ」の型を認識していないためです。何かのようなもの:

 SELECT t1.id, t2.title, t3.level FROM entity t1 LEFT JOIN document t2 ON t2.id = t1.id LEFT JOIN report t3 ON t3.id = t1.id 

子テーブルが増えると、結合が増えます -> 遅くなります。

これは、ターゲットがドキュメントかレポートかを確認し、どのフィールドにアクセスする必要があるかを判断する方法です。

// loads all users
$users = $this->em->getRepository('User')->findAll();
foreach($users as $user){
    $target = $user->getTarget()
    if($target instanceof Document){
        echo $target->getTitle(); 
    }
    else if($target instanceof Report){
        echo $target->getLevel()
    }
}
于 2013-08-01T13:04:47.333 に答える