DB_Table_Generator クラスは、DB_Table パッケージを用いて既存のデータベースを操作するためのコードを生成するためのものです。 これは、データベース内の全テーブルに対する DB_Table のサブクラスの雛形を作成します。テーブルのスキーマは、 データベースに問い合わせることによって取得します。 また、データベースに接続するためのコードや DB_Table_Database オブジェクトを作成するためのコードも含めることができます。
DB_Table_Generator オブジェクトが生成するすべてのコードは、 そのオブジェクトの $class_write_path プロパティで指定したディレクトリに書き込まれます。 デフォルトでは、これはカレントディレクトリになります。 デフォルトでは、たとえば 'thing' テーブル用に作成するクラスの名前は Thing_Table となります。 つまり、テーブル名の先頭を大文字にし、最後に '_Table' をつけたものがクラス名になるということです。 この最後につける文字列については $class_suffix プロパティで変更することができます。 このクラス定義を含むファイルの名前は、クラス名に拡張子 php をつけたものになります。 つまり、たとえば 'Thing_Table.php' のようになるということです。 このサブクラスから作成するインスタンスの名前は、テーブル名と同じになります。 つまり、たとえば 'thing' のようになります。
データベース $database の全テーブル用のコードを生成するには、 まず DB あるいは MDB2 のオブジェクトを $conn という名前で接続してデータベースに接続し、次のコードを実行します。
例 39-1データベース全体用のコードの生成
|
上の例では、すべてのコードが '/var/www/html/app1/db_table' (最後のディレクトリ区切り文字は不要) に書き込まれます。 このディレクトリが存在しない場合は、(可能なら) ディレクトリを作成します。 ディレクトリがすでに存在する場合、既存のファイルの上書きは行いません。 $class_write_path が設定されていない場合 (たとえばサンプルでこの行を削除した場合) は、 すべてのコードがカレントディレクトリに書き込まれます。
generateTableClassFiles() メソッドは、 各テーブル用のサブクラス定義の雛形を生成します。 テーブルごとに個別のファイルに書き込まれます。 上のように引数を指定せずにコールした場合は、 そのデータベース内のすべてのテーブルのサブクラス定義を生成します。
generateDatabaseFile() メソッドは 'Database.php' という名前のファイルを生成します。 デフォルトでは、ここにはデータベースへの接続用のコードや親の DB_Table_Database オブジェクトの作成用のコードが書き込まれます。 generateDatabaseFile() メソッドを上の例のようにコールする場合は、 generateTableClassFiles() の後にコールしなければなりません。 'Database.php' ファイル内のコードでは、 ("require_once" を使用して) 各テーブル用のサブクラスの定義を読み込み、 個々の DB_Table サブクラスのオブジェクトを作成 (ひとつのテーブルごとにひとつのオブジェクト) し、さらに親の DB_Table_Database オブジェクトのインスタンスを作成し、 すべてのテーブルを親に追加し、カラム名にもとづいた外部キーリレーションを推測します。 一般に、このファイルには多少手を加える必要があります。 つまり、データソース名 (DSN) を指定したり 自動判別に失敗した外部キーリレーションを指定したりといったことです。
デフォルトでは、generateTableClassFiles() および generateDatabaseFiles() はデータベース内の全テーブル用のコードを生成します。 特定のテーブル用のコードのみを生成させるには、パブリックプロパティ $tables にテーブル名の一覧を指定してからこれらのメソッドをコールします。 たとえば、 'table1'、'table2' および 'table3' の 3 テーブルについてのコードを生成するには、次のようにします。
例 39-2指定したテーブル用のコード生成
|
generateTableClassFiles() をコールした時点で DB_Table_Generator オブジェクトのプロパティ $tables に配列が設定されていない場合は、 generateTableClassFiles() メソッドはデータベースに問い合わせて全テーブルの一覧の配列を取得し (内部で getTableNames() メソッドをコールします)、 $table プロパティにその内容を設定します。