自動生成とデータベーススキーマ

自動生成とデータベーススキーマ – 基底クラスの生成とデータベーススキーマ

自動生成 (createTables.php) が行うこと

SQL 構築ツールの本質的特長の一つは、 整数をチェックし文字列をエスケープする事ができるよう、 データベース構造のある程度の情報を持っていることです。 データベースのテーブル構造に問い合わせるためには、 いくつかの方法があります。

  • 毎回 SQL クエリで問い合わせる
  • それぞれの Web ページの初期化の時に問い合わせる
  • アプリケーションがセットアップしている間に1度問い合わせ、 ファイルにストアする

DB_DataObject は通常これらのうちの 最後の方法を採ります (代わりに章の下の方を見てください)。 ファイルを読み込むために parse_ini_file 関数を利用していますので、適度に高速に動作します。 しかしながら、使用する前に DB_DataObject のセットアップが必要です。

DB_DataObjectのもう一つの主要なコンセプトは、 DB_DataObjectを継承したクラスをあなたが使用する ということです。 このクラスは、全ての表に関連する処理を行います。 大規模なデータベース向けにこれらのクラスをセットアップすることは、 時間の浪費になる可能性があります。そのため、 createTables.php ファイルが全てのクラスファイルの雛形を自動的に作成します。

自動生成を始めるために、pear/DB/DataObject/ ディレクトリに移動し、 c:\php4\php.exe createTables.php myconfig.ini と打ち込んでください。これで設定ファイルを読み込み、 データ定義ファイルに沿って全ての基底クラスを生成します。

バージョン1.5からオプション "proxy = full" が利用可能になりました。これにより、ini ファイルや事前に生成されたクラスを利用しなくとも DataObjects がオンザフライでクラスやスキーマを生成するようになります。

デフォルトのクラス定義

デフォルトで生成されるクラスは、このような感じです。

生成された継承クラス

<?php
/*
* Table Definition for group
*/


class DataObjects_Grp extends DB_DataObject {

    
###START_AUTOCODE
    /* the code below is auto generated do not remove the above tag */

    
var $__table='group';                             // table name
    
var $id;                              // int primary_key
    
var $name;                            // string
    
var $grp_owner;                       // int
    
var $official;                        // string
    
var $street;                          // string
    
var $postcode;                        // string
    
var $city;                            // string
    
var $homepage;                        // string
    
var $email;                           // string
    
var $extra;                           // blob

    /* Static get */
    
function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('DataObjects_Grp',$k,$v); }


    
/* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE
}
?>

クラスはテーブル名を定義し、 参照のためにいくつかのテーブルカラムに コメントを付けています。また、 単一行をオブジェクトとして素早く取得するために利用できる staticGet() メソッドも追加しています。 また、###END_AUTOCODE の後にテーブルに関連するコードを追加すべきです。

バージョン 1.6 以前では、__clone メソッドが生成されていましたが、 PHP5 では $x = clone($y); を使用するよう変更されましたので、 このメソッドは削除されました。 現在 DataObjects はダミー関数 clone を互換性のために (もし必要であれば) 生成します。

データベーススキーマファイル

デフォルトで生成されるデータベース定義ファイルは以下のような感じで、 "schema_location" 設定オプションで定義されたディレクトリに配置され、 データベースと同じ名前が付けられます。

もし、データベースを改名する場合、 ファイルを再生成するか同じ名前に合わせる必要があります。

もし、データベーススキーマを変更する (たとえば、カラムを追加したり型を変更する) 場合、 createTables.php を使用してスキーマファイルを再生成する必要があります。 今のところ、これは自動的には行われません (が、そのうち追加されるかも知れません)。

このファイルは手で編集すべきではありません (再生成されるときに全ての変更が失われるので) 。 設定オプション "sequence_{table} = key" を使用したり、 継承したクラスで sequenceKey() メソッドを定義することによって、 表のキーを上書きすることができます。

データベース設定ファイル


[group]
id = 129
name = 130
grp_owner = 129
official = 130
street = 130
postcode = 130
city = 130
homepage = 130
email = 130
extra = 130

[group__keys]
id = N

このブロックは、表と2進加算 (1=integer,2=string,128=not null, 129=integer かつ not null) によるフィールドの型、 または各表のキーの一覧を示しています。 このファイルを編集する必要はありません。

スキーマファイル使用の代替案

スキーマファイルを使わないで DataObjects を使用することは可能で、 2つの手順で実現することができます。

  • 継承したクラスで table() と keys() メソッドを定義する
  • DataObjects のインスタンスがあるときに table() と keys() に、 とある配列を渡す

この2つ目は、keys() と tables() のページで解説されています。

以下は、手で書いた schema.ini ファイルを使用しないクラスです。

これは、オブジェクト変数よりはメソッドの戻り値となるよう 設計されていますので、 print_r() の出力は余分な情報が含まれていないでしょう (また、大きな結果セットをダンプしたときよりは小さいでしょう) 。

手で書いた継承されたクラス

<?php
/*
* Table Definition for group
*/


class DataObjects_Grp extends DB_DataObject {

    
// you can define these yourself

    
var $__table='group';                             // table name
    
var $id;                              // int primary_key
    
var $name;                            // string
    
var $bday;                            // string
    
var $last;                            // datetime
    
var $active;                          // tinyint(1)
    
var $desc;                            // text
    
var $photo;                           // blob

    // these are usefull to be consistant with a autogenerated file.

    /* Static get */
    
function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('DataObjects_Grp',$k,$v); }


    
// now define your table structure.
    // key is column name, value is type
    
function table() {
        return array(
            
'id'     => DB_DATAOBJECT_INT,
            
'name'   => DB_DATAOBJECT_STR,
            
'bday'   => DB_DATAOBJECT_STR DB_DATAOBJECT_DATE,
            
'last'   => DB_DATAOBJECT_STR DB_DATAOBJECT_DATE DB_DATAOBJECT_TIME,
            
'active' => DB_DATAOBJECT_INT DB_DATAOBJECT_BOOL,
            
'desc'   => DB_DATAOBJECT_STR DB_DATAOBJECT_TXT,
            
'photo'  => DB_DATAOBJECT_STR DB_DATAOBJECT_BLOB,
        );
    }

    
// now define the keys.
    
function keys() {
        return array(
'id');
    }



}
?>
データベースアクセスのためのデフォルト値の設定 (Previous) 表名に基づいたクラスの自動ロードとインスタンス化 (Next)
Last updated: Tue, 29 Jul 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: alan@akbkhome.com
I forgot to add the example for the createTables.php ini file

To create the code in the /tmp folder (so you can copy it into place later)

use this as 'create.ini'
[DB_DataObject]

database = mysql://root:@localhost/thedb
schema_location = /tmp/myproj/DataObjects
class_location = /tmp/myproj/DataObjects
require_prefix = MyProject/DataObjects/
class_prefix = MyProject_DataObjects_

then run
php createTables.php create.ini