0

テクニック:ORM、Doctrine 1.1.6、KohanaPHP

Doctrine1.1.6を使用。モデルをさまざまなテーブルに分散させるにはどうすればよいですか?

詳細な状況:

ID、ログイン、パスワードを含み、1つのメールアドレス、多くのアドレス、その他の関係を持つクラスEntityがあります。他に2つのクラス、CompanyとPersonがあり、Entityを拡張します。すべてのログイン情報とパスワード情報が1つの場所に保存されるように、列集計を使用してそれらを拡張したいと思います。ここで、Personクラスに特定の列(名、姓など)を追加したいのですが、これを行う方法が見つかりません。ドキュメントに示されている唯一の例は、余分な列がない例です。

現在のクラス

エンティティクラス:

クラスエンティティはDoctrine_Recordを拡張します
{{
    パブリック関数setTableDefinition(){
        $ this-> setTableName('entity');
        $ this-> hasColumn('id'、'integer'、4、array(
             'type' =>'integer'、
             '長さ'=>4、
             '符号なし'=>0、
             'primary' => true、
             'autoincrement' => true、
             ));
        $ this-> hasColumn('login'、'string'、64、array(
             'タイプ'=>'文字列'、
             '長さ'=>64、
             '修正済み'=>false、
             'primary' => false、
             'notnull' => true、
             'autoincrement' => false、
             ));
        $ this-> hasColumn('password'、'string'、64、array(
             'タイプ'=>'文字列'、
             '長さ'=>64、
             '修正済み'=>false、
             'primary' => false、
             'notnull' => true、
             'autoincrement' => false、
             ));
        $ this-> hasColumn('created'、'date'、null、array(
             'タイプ'=>'日付'、
             'primary' => false、
             'notnull' => false、
             'autoincrement' => false、
             ));
        $ this-> hasColumn('modified'、'date'、null、array(
             'タイプ'=>'日付'、
             'primary' => false、
             'notnull' => false、
             'autoincrement' => false、
             ));

        $ this-> setSubclasses(array(
                'Person' => array( "type" => 1)
            ));
    }
}

人物クラス:

クラスPersonはEntityを拡張します
{{
    パブリック関数setTableDefinition(){
        $ this-> setTableName('person');
        $ this-> hasColumn('id'、'integer'、4、array(
             'type' =>'integer'、
             '長さ'=>4、
             '符号なし'=>0、
             'primary' => true、
             'autoincrement' => true、
             ));
        $ this-> hasColumn('firstname'、'string'、255、array(
             'タイプ'=>'文字列'、
             '長さ'=>255、
             '修正済み'=>false、
             'primary' => false、
             'notnull' => true、
             'autoincrement' => false、
             ));
        $ this-> hasColumn('insertion'、'string'、64、array(
             'タイプ'=>'文字列'、
             '長さ'=>64、
             '修正済み'=>false、
             'primary' => false、
             'notnull' => false、
             'autoincrement' => false、
             ));
        $ this-> hasColumn('lastname'、'string'、255、array(
             'タイプ'=>'文字列'、
             '長さ'=>255、
             '修正済み'=>false、
             'primary' => false、
             'notnull' => true、
             'autoincrement' => false、
             ));
    }
}

生成されたSQL:

CREATE TABLE `person`(
    `id` INT AUTO_INCREMENT、
    `firstname` VARCHAR(255)NOT NULL、
    `挿入`VARCHAR(64)、
    `lastname` VARCHAR(255)NOT NULL、
    主キー( `id`)
)ENGINE = INNODB

CREATE TABLE `entity`(`
    id` INT AUTO_INCREMENT、
    `login` VARCHAR(64)NOT NULL、
    `password` VARCHAR(64)NOT NULL、
    `作成された`DATE、
    `変更された`DATE、
    主キー( `id`)
)ENGINE = INNODB

誰かがこれを達成する方法を教えてもらえますか?

4

1 に答える 1

1

基本的にすべてが同じテーブルに格納されるため、これらの列をエンティティ クラスに追加する必要があります。つまり、これらの列は会社のエントリでも使用できるようになりますが、そこでの使用を禁止することもできます。

ただし、別のテーブルを使用して、それらを外部キーで参照することはできます。これにより、次のようなレイアウトが得られます。

  1. エンティティ- すべてのエンティティに共通の基本情報を格納します。さらに、このエンティティのタイプ (ユーザー、会社) を ID として保存します。
  2. entity_types - 各エンティティ タイプに対応するテーブルを格納します
  3. ユーザー- ユーザーに固有の情報と、対応するエンティティへのキーを格納します。
  4. Company - Userと同じで、追加情報がない場合はほとんど空になることがあります (このソリューションの実装方法によっては、簡単にするためにエンティティ ID だけを含む行を 1 つ追加できます)。

このようにして、エンティティに関する追加情報をいつでも (遅延) フェッチでき、テーブル自体はスリムなままです。エンティティを列集約として認識すると、Doctrine は適切なオブジェクトを返すように処理します。次に、追加情報を取得するためのカスタム関数を追加できます。

2 では間接指定を省略できます。

于 2010-02-24T19:39:51.333 に答える