データアクセス層のクラス(DAO)を作成するツールです。
データアクセス層は、ビジネスロジック層から分離し、リソース(以下ここではDBとします)へのアクセス方法を汎用化することで独立性や再利用性が高まり、 DBの修正に対する影響範囲も局所化できる利点があります。 また、ビジネスロジック層の開発者とデータアクセス層の開発者が分かれている場合、ビジネスロジック層の担当者はデータアクセス層のインターフェイスだけ分かればいいので、 どこからどのような方法でリソースを取得するかは、意識する必要はありません。
SyLでもDAOクラスを作成することができるので、ここではその作成方法を説明します。
なお、DAOクラスはSyLフレームワークに依存しているわけではないのでDAOクラス単体で使用することができます。 よって、SyLフレームワークを使っていない他のシステムで使用することもできます。
データベースアクセスは SyL_DB ライブラリを使用し抽象化されています。(現時点では、MySQLとPostgreSQLをサポートしています)
ただし、対応しているカラム型は、基本的に文字列型/数値型/日付型のみです。
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を作成するテーブル名 |
このユーティリティを使用するには、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クラス群を作成します。
この例では、-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 $
コマンド実行後、dao.xml の outputDir に設定したディレクトリに、DAOクラス群が生成されます。
outputDir
/Dao
/Access
DaoAccessAbstract.php - (1)
DaoAccess[テーブル名].php - (2)
/Entity
DaoEntity[テーブル名].php - (3)
DAOアクセスクラスの共通の親クラス。最初にDAOを生成したときは、このクラス内のDB接続文字列を修正する必要があります。
コマンド使用時に指定したテーブルにアクセスするためのクラスです。指定したテーブルにアクセスする際は、ここにデータアクセスロジックを記述します。
コマンド使用時に指定したテーブルのスキーマ定義です。主に (2) のクラスから使用されます。
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";
<?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);
<?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";
<?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";
開発を進める上で、「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);