データアクセス層のクラス(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);