2011-07-21 11 views
3

Doctrine 2でクラステーブルの継承と外部キーの関係に使用される列を指定するにはどうすればよいですか?たとえば、次の2つのクラスを取る:Doctrine2でクラステーブル継承のための外部キー列を指定する方法は?

これにより
/** 
* @Entity 
* @InhertanceType("JOINED") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap("person" = "Person", "employee" = "Employee") 
*/ 
class Person 
{ 
    /** @Id */ 
    public $id; 

    /** @Column(type="string") */ 
    public $ssn; 
} 

/** @Entity */ 
class Employee 
{ 
    /** @Column(type="decimal") */ 
    public $salary; 
} 

は、Doctrineはこの沿ってややテーブル構造を期待:person.idを指す外部キーemployee.person_idあり

CREATE TABLE `person` (
    `id` INT(11) NOT NULL auto_increment, 
    `ssn` VARCHAR(255) default NULL, 
    PRIMARY_KEY(`id`) 
) 

CREATE TABLE `employee` (
    `person_id` INT(11) NOT NULL, 
    `salary` DECIMAL(10,2) default NULL, 
    PRIMARY_KEY(`person_id`) 
) 
ALTER TABLE `employee` 
    ADD CONSTRAINT `person_fk` FOREIGN KEY (`person_id`) 
     REFERENCES `person` (`id`) ON DELETE CASCADE 

。しかし、どうすればDoctrineにどのカラムを使用するように指示できますか? person.idの参照は、Personクラスの@Idアノテーションから来ていますが、代わりにperson.ssnにFKを作成したいと考えています(これはSSNが自然にユニークなので考えられます)。

employee.person_idが代わりにemployee.p_idと呼ばれる従来のデータベースを持っている場合はどうなりますか?

+0

私はそれらが同一でなければならないと思います(親と同じ主キーを持つサブクラス)。後でそれを参照してください。 – Orbling

+0

ありがとうございます。それは奇妙に聞こえる。 'doctrine orm:schema-tool:create 'は' employee.id'ではなく 'employee.person_id'を外部キーとして作成したかったと思います。明日私が仕事に戻ったときにチェックします。 –

答えて

2

まず、Employeeクラス定義に "extends Person"がありません。

私が知っていることから、あなたがこのタイプの継承をしているとき、doctrineはメインクラスのプライマリキーを使って他のすべてのテーブルを結合します。

クエリを実行すると、doctrineはすべての子テーブルを親に結合してから、弁別子マップに従って水和します。これを念頭に置いて、主キーが自動的にインクリメンタルIDかユニークフィールドかどうかは関係ありません。親クラスにssnが定義されている場合は、それをすべてのサブクラスで検索することができます。

ここにヒントがいくつかあります。必要に応じて、自動IDを削除し、ssnを主キーとして使用すると、doctrineはすべての子テーブルに同じフィールドが定義されていることを期待します。パフォーマンスのために、とにかく結合を行うために255文字列の代わりに整数を持つことが賢明かもしれません。

自動IDを取得する場合は、親クラスにユニークなインデックスを追加すると、そのフィールドでクラスにアクセスするとパフォーマンスが低下することはありません。

あなたは、何か他のものことを何かとテーブル名であるクラス名を持つこの

/** @Id @Column(name="p_id") */ 
public $id; 

を使用しかし、その後、相続の一部であるすべてのテーブルが、その名前を使用する必要があることを覚えておきたい場合。

さらに、私は通常、既存のデータベースをマッピングし、それを拡張する(doctrineに移行する)ためにdoctrineを使用します。新しいフィーチャを追加してモデルに必要な場合は、マッピングとテーブルを作成します。教義の継承が機能します。しかし、継承でモデル化できると考える既存のテーブルがある場合、いくつかの問題があり、既存のテーブルを変更する必要があるかもしれません。

これが役に立ちます。

関連する問題