ドキュメント
リリースカレンダー
リンク
SourceForge.jp SourceForge.JPへ
php.net PHP公式サイトへ
TOP  >  ドキュメント  >  コマンドラインユーティリティ > データアクセスクラス生成ツール

データアクセスクラス生成ツール

 データアクセス層のクラス(DAO)を作成するツールです。

 データアクセス層は、ビジネスロジック層から分離し、リソース(以下ここではDBとします)へのアクセス方法を汎用化することで独立性や再利用性が高まり、 DBの修正に対する影響範囲も局所化できる利点があります。 また、ビジネスロジック層の開発者とデータアクセス層の開発者が分かれている場合、ビジネスロジック層の担当者はデータアクセス層のインターフェイスだけ分かればいいので、 どこからどのような方法でリソースを取得するかは、意識する必要はありません。

 SyLでもDAOクラスを作成することができるので、ここではその作成方法を説明します。

なお、DAOクラスはSyLフレームワークに依存しているわけではないのでDAOクラス単体で使用することができます。 よって、SyLフレームワークを使っていない他のシステムで使用することもできます。

データベースアクセスは SyL_DB ライブラリを使用し抽象化されています。(現時点では、MySQLとPostgreSQLをサポートしています)
ただし、対応しているカラム型は、基本的に文字列型/数値型/日付型のみです。

1. コマンド仕様

DAOクラス群を作成するコマンドです。

※ 実行ファイルは、解凍したアーカイブに対して SyL/bin/dao.php になります。

$ php dao.php --help
Usage:
  php dao.php -d <dir> -t <name>
  php dao.php -c <file> -t <name>
  php dao.php [option]

Options:
  -d <dir>   project directory (use DAO setting file : SYL_PROJECT_DIR/config/dao.xml)
  -c <file>  DAO setting file
  -t <name>  table name
  -h         show this help, then exit
  -v         output version information, then exit

引数仕様

オプション 必須 内容
-d <dir> △(※1) プロジェクトディレクトリ
SYL_PROJECT_DIR/config/dao.xml にあるDAOを作成するための設定ファイルが使用されます。
-c <name> △(※1) DAOを作成するための設定ファイル
-t <table>   DAOを作成するテーブル名
※1 「プロジェクトディレクトリ」または「DAOを作成するための設定ファイル」のどちらかは指定しなければなりません。

2. 事前準備

このユーティリティを使用するには、DB接続文字列や出力ディレクトリを定義した設定ファイル(dao.xml)が必要なので、事前に作成しておきます。

SyLフレームワークを使用している場合は、プロジェクトを作成したとき、直下の config ディレクトリに dao.xml ファイルがありますのでこちらを使用します。

下記は設定例です。
connectionString と outputDir は必須項目なので、必ず指定してください。

<?xml version="1.0" encoding="UTF-8" ?>
<syl-dao xmlns="http://syl.jp/schema"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://syl.jp/schema syl-dao.xsd">
  <connectionString>mysql://user:password@hostname:port/database</connectionString>
  <outputDir>{$SYL_PROJECT_DIR}/lib</outputDir>
  <encoding>utf-8</encoding>
  <validationMessage>
    <require>
      <message>{$name}は必須です</message>
    </require>
    <numeric>
      <message>{$name}は数値で入力してください</message>
      <min-error-message>{$name}は{$min}以上で入力してください</min-error-message>
      <max-error-message>{$name}は{$max}以下で入力してください</max-error-message>
    </numeric>
    <date>
      <message>{$name}は日付で入力してください</message>
    </date>
    <time>
      <message>{$name}が正しくありません</message>
    </time>
    <byte>
      <message>{$name}は{$max}文字(バイト)以内で入力してください</message>
    </byte>
    <multibyte>
      <message>{$name}は{$max}文字以内で入力してください</message>
    </multibyte>
  </validationMessage>
</syl-dao>

参考) dao.xml の仕様

3. コマンド実行

コマンドを実行し、DAOクラス群を作成します。

この例では、-d でプロジェクトディレクトリを指定し、-t でDAOクラスの元になるテーブル名を指定します。 SyLフレームワークを使用しないで、単体でDAOクラス群を作成する場合は、-d の代わりに -c で「2. 事前準備」で作成した dao.xml を指定してください。

$ php dao.php -d /home/foo/example -t stock_company
=== Input Environment ===
- project directory: /home/foo/example
- config_file: /home/foo/example/config/dao.xml
- table_name: stock_company
- class_name (entity): DaoEntityStock_company
- output_file (entity): /home/foo/example/lib/Dao/Entity/DaoEntityStock_company.php
- class_name (access): DaoAccessStock_company
- output_file (access): /home/foo/example/lib/Dao/Access/DaoAccessStock_company.php

=== Table Schema ===
[columns]
  STOCK_CODE
  STOCK_NAME
[primary]
  STOCK_CODE

=== Output Files ===
  -> creating directory: /home/foo/example/lib/Dao
  -> creating directory: /home/foo/example/lib/Dao/Entity
  -> creating directory: /home/foo/example/lib/Dao/Access
  -> generating file: /home/foo/SyL/opt/dao/var/skel-templates/EntityTemplate.php -> /home/foo/example/lib/Dao/Entity/DaoEntityStock_company.php
  -> generating file: /home/foo/SyL/opt/dao/var/skel-templates/AccessAbstractTemplate.php -> /home/foo/example/lib/Dao/Access/DaoAccessAbstract.php
  -> generating file: /home/foo/SyL/opt/dao/var/skel-templates/AccessTemplate.php -> /home/foo/example/lib/Dao/Access/DaoAccessStock_company.php

=== Result ===
  [table entity] /home/foo/example/lib/Dao/Entity/DaoEntityStock_company.php
  [table access abstract] /home/foo/example/lib/Dao/Access/DaoAccessAbstract.php
  [table access] /home/foo/example/lib/Dao/Access/DaoAccessStock_company.php
$


4. 生成ファイル

コマンド実行後、dao.xml の outputDir に設定したディレクトリに、DAOクラス群が生成されます。

outputDir
  /Dao
    /Access
      DaoAccessAbstract.php      - (1)
      DaoAccess[テーブル名].php  - (2)
    /Entity
      DaoEntity[テーブル名].php  - (3)

(1) DaoAccessAbstract.php

DAOアクセスクラスの共通の親クラス。最初にDAOを生成したときは、このクラス内のDB接続文字列を修正する必要があります。

(2) DaoAccess[テーブル名].php

コマンド使用時に指定したテーブルにアクセスするためのクラスです。指定したテーブルにアクセスする際は、ここにデータアクセスロジックを記述します。

(3) DaoEntity[テーブル名].php

コマンド使用時に指定したテーブルのスキーマ定義です。主に (2) のクラスから使用されます。

注意) dao.php コマンドによるファイルの上書きについて
 dao.php コマンドを実行したときに既存ファイルが存在した場合、DBスキーマの変更を考慮して Dao/Access/* ファイルは上書きされませんが、Dao/Entity/* ファイルは常に上書きされます。 よって、特に理由が無い限り、Dao/Entity/* ファイルは修正しないことをお勧めします。

5. DAOクラスの使用例

DAOクラスの基本は、主キーに対するCRUD操作になります。

主キーに対する操作

<?php
// テーブルアクセスクラスをインクルード
require_once 'path/to/Dao/Access/DaoAccess[テーブル名].php';

// テーブルアクセスオブジェクトを作成
$access = new DaoAccess[テーブル名]();

// SELECT (主キーに対し、1レコード取得)
$row = $access->select('7203');
print_r($row);

// INSERT (1レコードINSERT)
$record = $access->createRecord();
$record->STOCK_CODE = '9999';
$record->STOCK_NAME = 'test';

$inserted = $access->insert($record);
echo "inserted : {$inserted}\n";

// UPDATE(主キーに対し、1レコード更新)
$record = $access->createRecord(true);
$record->STOCK_NAME = 'test2';

$updated = $access->update($record, '9999');
echo "updated : {$updated}\n";

// DELETE(主キーに対し、1レコード削除)
$deleted = $access->delete('9999');
echo "deleted : {$deleted}\n";

条件付きSELECT

<?php
// テーブルアクセスクラスをインクルード
require_once 'path/to/Dao/Access/DaoAccess[テーブル名].php';

// テーブルアクセスオブジェクトを作成
$access = new DaoAccess[テーブル名]();

// SELECT (主キーに対し、条件を指定して1レコード取得)
$condition = $access->createCondition();
$condition->addEqual('DELETE_FLAG', '0');
$row = $access->select('7203', $condition);
print_r($row);

// SELECT (条件を指定して複数レコード取得)
$condition = $access->createCondition();
$condition->addEqual('NIKKEI225', '1');
$rows = $access->selects($condition);
print_r($rows);

条件付きUPDATE

<?php
// テーブルアクセスクラスをインクルード
require_once 'path/to/Dao/Access/DaoAccess[テーブル名].php';

// テーブルアクセスオブジェクトを作成
$access = new DaoAccess[テーブル名]();

// UPDATE(主キーに対し、条件を指定して1レコード更新)
$record = $access->createRecord(true);
$record->STOCK_NAME = 'test2';

$condition = $access->createCondition();
$condition->addEqual('DELETE_FLAG', '0');

$updated = $access->update($record, '9999', $condition);
echo "updated : {$updated}\n";

// UPDATE(条件を指定して複数レコード更新)
$record = $access->createRecord(true);
$record->STOCK_NAME = 'test3';

$condition = $access->createCondition();
$condition->addEqual('DELETE_FLAG', '0');

$updated = $access->update($record, $condition);
echo "updated : {$updated}\n";

条件付きDELETE

<?php
// テーブルアクセスクラスをインクルード
require_once 'path/to/Dao/Access/DaoAccess[テーブル名].php';

// テーブルアクセスオブジェクトを作成
$access = new DaoAccess[テーブル名]();

$condition = $access->createCondition();
$condition->addEqual('LAST_UPDATE', '2000-01-01 00:00:00');

// UPDATE(主キーに対し、条件を指定して1レコード削除)
$deleted = $access->delete('9999', $condition);
echo "deleted : {$deleted}\n";

// UPDATE(条件を指定して複数レコード削除)
$deleted = $access->deletes($condition);
echo "deleted : {$deleted}\n";


6. DAOクラスの拡張

 開発を進める上で、「5. DAOクラスの使用例」で賄えないような要件も当然出てきます。 そのような場合は、テーブルアクセスクラスにメソッドを追加して個別にSQLを実行します。

作成初期状態のテーブルアクセスクラスは下記のようになっています。

$ cat path/to/Dao/Access/DaoAccess[テーブル名].php
<?php
require_once 'DaoAccessAbstract.php';
require_once dirname(__FILE__) . '/../Entity/DaoEntity[テーブル名].php';

class DaoAccess[テーブル名] extends DaoAccessAbstract
{
protected $main_alias = 'a';
protected $class_names = array (
  'a' => 'DaoEntityStock_company'
);
protected $relations = array(
);
}

この状態から、個別にSQLを発行する selectCompany メソッドを追加します。(赤字の箇所)

<?php
require_once 'DaoAccessAbstract.php';
require_once dirname(__FILE__) . '/../Entity/DaoEntity[テーブル名].php';

class DaoAccess[テーブル名] extends DaoAccessAbstract
{
protected $main_alias = 'a';
protected $class_names = array (
  'a' => 'DaoEntityStock_company'
);
protected $relations = array(
);

    public function selectCompany($code)
    {
        $db = $this->dao->getDB();
    
        $sql  = "";
        $sql .= "SELECT ";
        $sql .=   "STOCK_CODE ";
        $sql .=   ",STOCK_NAME ";
        $sql .= "FROM ";
        $sql .=   "[テーブル名] ";
        $sql .= "WHERE ";
        $sql .=   "STOCK_CODE = '" . $db->escape($code) . "' ";

        return $db->query($sql);
    }

}

追加したメソッドのコールは、DAOを使用するコードから下記のように行います。

<?php
// テーブルアクセスクラスをインクルード
require_once 'path/to/Dao/Access/DaoAccess[テーブル名].php';

// テーブルアクセスオブジェクトを作成
$access = new DaoAccess[テーブル名]();

// selectCompany メソッドのコール
$row = $access->selectCompany('7203');
print_r($row);