は、ここに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](https://i.stack.imgur.com/SbylI.png)
各クラスは、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子行を追加または更新できません。外部キー制約は失敗します(
aaa
。customers
、CONSTRAINTcustomers_ibfk_1
FOREIGN KEY(ID
が)私のCREATE TABLEのSQLスクリプトです。ここ
「)DELETE CASCADE ON INSUREES
(ID
)を参照しています
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
);
を削除されるようにしますが、外部キーをオンカスケード削除を追加し、確認してくださいそれらはデータベース内のテーブルとして基本クラスを使用しないためです。あなたのコードでは、基本クラスをデータベースのテーブルとして使用してエラーが発生します。 – nospor
すべてのクラスに@Entityアノテーションが付けられています。 – Aleks
注釈と彼の注釈を確認してください。彼らは違う、私を信じて;)彼は抽象的なエンティティでクエリを構築しません。 – nospor