2017-01-04 8 views
0

は、ここにUMLです:Doctrine2マルチレベルの継承

/** 
    * @Entity 
    * @Table(name="PERSONS") 
    * @InheritanceType("JOINED") 
    * @DiscriminatorColumn(name="PERSON_TYPES", type="string") 
    * @DiscriminatorMap({"INSUREE" = "Insuree", "ADMIN" = "Admin"}) 
    */ 
    abstract class Person extends Entity{} 

    /** 
    * @Entity 
    * @Table(name="INSUREES") 
    * @InheritanceType("JOINED") 
    * @DiscriminatorColumn(name="INSUREE_TYPES", type="string") 
    * @DiscriminatorMap({"CUSTOMER" = "Customer", "THIRD_PARTY" = "ThirdParty"}) 
    */ 
    abstract class Insuree extends Person{} 

    /** 
    * @Entity 
    * @Table(name="ADMINS") 
    */ 
    final class Admin extends Person implements User{} 

    /** 
    * @Entity 
    * @Table(name="CUSTOMERS") 
    */ 
    final class Customer extends Insuree implements User{} 

    /** 
    * @Entity 
    * @Table(name="EXPERTS") 
    */ 
    final class Expert extends Person{} 
enter image description here

各クラスは、SQLテーブルをマッピングし、マッピングは次のようになります

私はすべての顧客または私はこのエラーを得た他の具象クラスを見つけることを試みる:

キャッチされない教義\インスタン\例外の\ InvalidArgumentException:の提供しをEDクラス「Insureeは」抽象的で、かつでインスタンス化することはできません...

私はマッピング階層githubの上のプロジェクトは私に似ていると正常に動作しますが見つかりました:

https://github.com/paulandrieux/MultipleInheritanceSandbox/tree/master/src/Acme/DemoBundle/Entity

EDIT:

トップクラス(人)に、すべての弁別を入れた後、Doctrineは私はこのエラーを取得するように、新しい顧客を保持しようとすると、INSUREESテーブルにデータを挿入スキップ:

params [10、 ""、 "]]で 'INSERT INTO CUSTOMERS(ID、ID_CARD、SEPA)VALUES(?、?、?)'を実行中に例外が発生しました:SQLSTATE [23000]:整合性制約違反: 1452子行を追加または更新できません。外部キー制約は失敗します(aaacustomers、CONSTRAINT customers_ibfk_1 FOREIGN KEY(IDが)私のCREATE TABLEのSQLスクリプトです。ここ

「)DELETE CASCADE ON INSUREESID)を参照しています

CREATE TABLE IF NOT EXISTS PERSONS(
    ID INTEGER NOT NULL AUTO_INCREMENT, 
    LAST_NAME VARCHAR(25) NULL, 
    FIRST_NAME VARCHAR(25) NULL, 
    ADDRESS VARCHAR(25) NULL, 
    CITY VARCHAR(25) NULL, 
    ZIP_CODE BIGINT(5) NULL, 
    TEL VARCHAR(13) NULL, 
    PERSON_TYPES ENUM("ADMIN","EXPERT","THIRD_PARTY","CUSTOMER"), 
    MAJ TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (ID) 
); 

CREATE TABLE IF NOT EXISTS INSUREES(
    ID INTEGER NOT NULL UNIQUE, 
    BONUS_MALUS REAL(5,2) DEFAULT 1.0, 
    FOREIGN KEY (ID) REFERENCES PERSONS(ID) ON DELETE CASCADE 
); 


CREATE TABLE IF NOT EXISTS THIRD_PARTIES(
    ID INTEGER NOT NULL UNIQUE, 
    COMPAGNY VARCHAR(128) NULL, 
    FOREIGN KEY (ID) REFERENCES INSUREES(ID) ON DELETE CASCADE 
); 


CREATE TABLE IF NOT EXISTS EXPERTS(
    ID INTEGER NOT NULL UNIQUE, 
    RANK BIGINT(4) NULL, 
    FOREIGN KEY (ID) REFERENCES PERSONS(ID) ON DELETE CASCADE 
)comment = ""; 

CREATE TABLE IF NOT EXISTS CUSTOMERS(
    ID INTEGER NOT NULL UNIQUE, 
    ID_CARD VARCHAR(100), 
    SEPA VARCHAR(100), 
    FOREIGN KEY(ID) REFERENCES INSUREES(ID) ON DELETE CASCADE 
); 

CREATE TABLE IF NOT EXISTS ADMINS(
    ID INTEGER NOT NULL UNIQUE, 
    ROLE VARCHAR(128) NULL, 
    FOREIGN KEY (ID) REFERENCES PERSONS(ID) ON DELETE CASCADE 
); 
+0

を削除されるようにしますが、外部キーをオンカスケード削除を追加し、確認してくださいそれらはデータベース内のテーブルとして基本クラスを使用しないためです。あなたのコードでは、基本クラスをデータベースのテーブルとして使用してエラーが発生します。 – nospor

+0

すべてのクラスに@Entityアノテーションが付けられています。 – Aleks

+0

注釈と彼の注釈を確認してください。彼らは違う、私を信じて;)彼は抽象的なエンティティでクエリを構築しません。 – nospor

答えて

2

はあなたが唯一のInheritanceType、DiscriminatorColumnを定義することが許可され、あなたのケースにある一番上のクラスDoctrine class-table-inheritanceでDiscriminatorMap。

私は、次のことをお勧めします:interface_taskは、あなたの場合には人です database-scheme

/** 
    * @Entity 
    * @Table(name="PERSONS") 
    * @InheritanceType("JOINED") 
    * @DiscriminatorColumn(name="PERSON_TYPES", type="string") 
    * @DiscriminatorMap({ 
      "INSUREE" = "Insuree", 
      "ADMIN" = "Admin", 
      "CUSTOMER" = "Customer", 
      "EXPERT" = "Expert" 
     }) 
    */ 
    abstract class Person extends Entity{} 

    /** 
    * @Entity 
    * @Table(name="INSUREES") 
    */ 
    abstract class Insuree extends Person{} 

更新:

あなたのデータベース・スキームは次のようになります。これはスーパークラスを指すすべての子クラス(および子子クラス)で行い、IDはスーパークラスのinterface_task(あなたの場合は人)のIDを指す外部キーです。

また、あなたが、子クラスを削除した場合、データベース内の親クラスは、あなたが私たちを示した外部例が異なっていること

+0

私はこのようなマッピングを変更しました。顧客を作成するまではうまく動作していたようでした。 DoctrineのINSERTクエリはINSUREテーブルをスキップし、次のように処理されます。 人物データを挿入 - >顧客データを挿入します。整合性制約違反が発生します。 – Aleks

+0

各エンティティごとにテーブルが必要です。各テーブルには、削除時カスケードを持つ最上位クラス(Person)のIDを指す外部キーがあります – Sepultura

+0

私の質問を更新しました: 'create table 'スクリプト。 – Aleks

関連する問題