SOY2フレームワークの解説 1回目 SOY2DAO (2/2)
2010.04.09
SOY2フレームワークの解説 1回目 SOY2DAO (2/2)
○SQLのパターン
SQLを書くことが多いのは、更新・削除周りよりもデータ取得周りだと思われます。 SOY2DAOではコメントを使い以下の処理を自動化します。
- 結果を
- 1件だけ取得、存在しない場合はエラーとする
- 連想配列で取得
- 連想配列の配列で取得
- オブジェクトの配列で取得
- 主キーをキーとした、連想配列・オブジェクトの連想配列で取得
- 特定のカラムの値だけを取得(例:count(id) の値だけを取得)
- 外部キーなど、特定のカラムを条件に取得
- 結果の件数の最大を設定
- 結果の件数のオフセット設定
- where句以下をコメントで指定して取得
- SQLを全て記述して取得
- 取得するカラムを指定
条件によってSQLが全く異なる場合を除き、これらで8割くらいはSQLを自動生成することが出来ると思います。
具体例を交え解説します。
・外部キーなど、特定のカラムを条件に取得
getBy〜から始まるメソッドを定義することで生成します。
例「type」というカラムがある場合、abstract function getByType($type);
・where句以下をコメントで指定して取得 値の範囲の指定や、LIKE検索、範囲の指定などはwhere句以下を指定します。
例 価格を引数で指定し、その価格以下の商品を取得
/** * @query price < :price */ abstract function getItemsByPrice($price);
結局ここにSQLを書いたんじゃカラム名が変更されたらダメじゃないかと思われるかもしれません。カラム名も指定出来ますが、基本的にはオブジェクトの変数名を指定することを進めています。
/** * 変数名で行う場合 * @query #information# is null */ abstract function getEmptyInformationItems();
#information#が自動的にsample_item_informationに置換されます。 また、引数にオブジェクトを取ることも出来ます。
/** * 変数名で行う場合 * @query #information# is null AND #type# = :type */ abstract function getByItem(Item $item);
オブジェクトのメンバ変数が:typeに自動的に設定されます。
○abstractクラスであることのメリット
オブジェクト指向に詳しい方はなんでabstractクラスなんだ?と疑問に思われるでしょう。 SOY2DAOではabstractなクラスのコメント部分を検索し、全てのメソッドを実装したクラスを自動生成します。
ItemDAO → ItemDAOImpl
これらをキャッシュ化するため、自動生成しても遅くならないのです。
加えてabstractクラスであることのメリットとして、メソッドも定義することがあります。
/** * @query #information# is null */ function doSome($flag = false){ if($flag){ return $this->doSomeImpl(); } $sql = $this->getQuery(); $res = $this->executeQuery($sql);//SQLの発行 ... } abstract function doSomeImpl();
このように引数によって別メソッドを呼んだり、SQLの生成部分はSOY2DAOに任せ処理をPHPで書くことが出来ます。
○まとめ
DAOパターンにおいて重要なのは、テーブルレイアウトや仕様に変更が生じた時の影響範囲を少なくすることです。 SOY2DAOは変更に強く、カラムを追加する場合でもクラスに変数を追加するだけですむため、テーブルレイアウトなどについては見切り発車で作ることが出来るようになりました。
SQL実行前に自動的に呼ばれるトリガー機能を使って更新時に自動的に更新日を入力したり、@tableでjoinするテーブル名を書くことで検索専用のDAOを作るなどのTipsも多数あります。いつかご紹介出来ればと思います。
次回はテンプレートエンジンのSOY2HTMLについて解説します。