Doctrine 2でZF2を使用し、Discriminatorsを使用することについて、多くのことが尋ねられます:親エンティティのすべての子エンティティを宣言しないでください。特に複数のモジュールがある場合は?ZF2 + Doctrine 2 - クラステーブル継承を持つ子レベルのディスクリミネータ
短い答えはです。discriminatorMap
を宣言しないでください。 Doctrineはあなたのためにそれを処理します。
答えは以下のとおりです。
Doctrine 2でZF2を使用し、Discriminatorsを使用することについて、多くのことが尋ねられます:親エンティティのすべての子エンティティを宣言しないでください。特に複数のモジュールがある場合は?ZF2 + Doctrine 2 - クラステーブル継承を持つ子レベルのディスクリミネータ
短い答えはです。discriminatorMap
を宣言しないでください。 Doctrineはあなたのためにそれを処理します。
答えは以下のとおりです。
親の代わりに子供のエンティティで、あなたの子供のエンティティを宣言できる方法に関する人気の記事is this one。
しかし、Doctrine 2は書かれてから多少変更されました。 AnnotationWriter
は存在しません。
しかし、私が質問したように、より単純な方法です。何もしないでください。
"Class Table Inheritance"メソッド( "単一テーブル継承"とは対照的に)を使用するディスクリミネータを使用するには、ディスクリミネータマップを宣言しないでください! (これもSTIでも有効かどうかわからない)
この回答と同じ問題を説明し、多くの人がまだ持っている古いチケットon Githubが見つかりました。親に宣言するのは意味がありません。それを読んだ後、私はコードを読んで、慎重にドキュメントを読み直しました。
また、ドキュメントを読んでいるときには気をつけなければなりません。
引用:
物事は注意する:
@InheritanceTypeは、@DiscriminatorColumnと@DiscriminatorMapは、マッピングされたエンティティ階層の一部であり、最上位クラスに指定する必要があります。
@DiscriminatorMapは、どの型の識別子があるかを識別する識別器列の値を指定します。上記の場合、 "person"の値は行がPerson型であることを示し、 "employee"は行がEmployee型であることを示します。
discriminatorマップが適用されるエンティティクラスと同じ名前空間にクラスが含まれている場合、discriminatorマップ内のクラスの名前は完全修飾である必要はありません。
識別子マップが提供されていない場合、マップは自動的に生成されます。自動的に生成された弁別子マップには、各クラスの小文字のショートネームがキーとして含まれています。
はもちろん、ドキュメントの上の部分は、明示的に何も提供されなかった場合はマップはを生成されるだろうと述べているん。 はの最初のと矛盾しますが、ということに注意してください。これは、@DiscriminatorMap
が階層の最上位クラスに提供されなければならないということです。
あなたが複数のモジュールにまたがってクラスを伸ばしていたら(これを読んでいるのではないかと推測しているので)、弁別子のマップを宣言しないでください!
私は以下の例をご任せします:
<?php
namespace My\Namespace\Entity;
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* // NOTE: No @DiscriminatorMap!!!
*/
class Person
{
// ...
}
<?php
namespace My\Other\Namespace\Entity;
/** @Entity */
class Employee extends \My\Namespace\Entity\Person
{
// ...
}
あなたのエンティティをチェックする教義CLIコマンドを使用すると、あなたはこれが正しいでしょう。
また、それは完全に実体チェックコマンドを使用して動作することを確認します
./vendor/bin/doctrine-module orm:mapping:describe “\My\Namespace\Entity\Person”
そのコマンドの応答の先頭付近に次の行になります。
| Discriminator map | {“person”:”My\\Namespace\\Entity\\Person”,”employee”:”My\\Other\\Namespace\\Entity\\Employee”}