自動生成で楽するPHPのDB処理

PHPに限りませんが、データベース周りの処理って皆さんどういう風に書いてるんでしょうか?

自分の場合は、下のクラス図のようなDBレイヤーをラップするクラスを作って毎回統一されたインターフェイスで処理できるようにしています。どの言語でも同じような構成のクラスを作るようにすると、インターフェイスが同じなので楽に記述できます。

Capsule model diagram

このクラス群を、データベース処理周りをカプセル化するという意味もあり、"Capsule" という名前を付けて使っています。

以下はPHPでのCapsule実装の最新版です(DBレイヤーで使用しているadodbを同梱)。

Capsule Ver.1.0

Capsuleの利用例

図だけでは分かりにくいと思うので、簡単な例を挙げてみます。

今回は、簡単なトピックス情報のデータベースを例にしたいと思います。テーブル定義は以下のような単純なものです。

CREATE TABLE topics
(
  id serial NOT NULL,
  date date,
  title character varying(256),
  "desc" character varying(4096),
  CONSTRAINT topics_id_pkey PRIMARY KEY (id)
);

このテーブルに対しての処理コードは、以下のような感じになります。

$dao = new TopicsDAO();  // 最初のDAOインスタンス化で自動的に接続される

$collection = $dao->findAll();  // select * from topics
while($collection->hasNext())
{
    $topics = $collection->next();
    $id = $topics->getId();
    $date = $topics->getDate();
    $title = $topics->getTitle();
    $desc = $topics->getDesc();
    // ~各変数について表示などの処理~
}

どうですか、直感的で分かりやすいのではないかと思います。
insertやupdateの場合は以下のような感じです。

// insertの例
$topics = new Topics();
$topics->setDate("2007/12/01");
$topics->setTitle("12月が始まるぞ!");
$topics->setDesc("もういくつねるとおしょうがつ");
$dao->insert($topics);

// updateの例($pkey はユーザパラメータが代入されている)
$topics = $dao->findByPrimaryKey($pkey);
$topics->setDesc("こんにちはこんにちは");
$dao->update($topics);

もちろん、上記を実行可能にするためにはクラス図のConcreteXXXにあたる3つのクラスを実装する必要があります。これらの中身は以下のような感じです。(EUCなのでブラウザで開くと化けるかもしれません)

コード量としてはかなり少ないと思います。コアな処理はCapsule(および実際のDBレイヤーのライブラリ)が担当しているためです。

MyGeneration

MyGeneration

でも、これを毎回書くのはちょっと面倒くさい!って思う人もいると思います。特にテーブルが100個とか増えると大変になってきます。

そこで、タイトルにもあるように自動生成でこのコードを出力してしまいます。コードを自動生成するための前提として、実際に使うデータベースにそのスキーマが存在する必要があります。

データベースへアクセスして、そのスキーマを読み込んでその情報を元にして出力しているためです。

コードの自動生成には、MyGeneration というツールを使います。MyGenerationのサイトへアクセスし、右上の方の download.com のリンクをクリックしてダウンロードしてください。

MyGeneration セットアップ

なお、実行にはMDAC 2.7以降が必要らしいのですが、Vista環境の場合MDACじゃなくて、Windows Data Access Components 6.0とかになっているらしく、セットアップによる自動検出に失敗(実際の動作には影響ありません)してしまうのでVistaを使っている場合はセットアップの際、上記画像のようにDetect MDAC 2.7+ のチェックボックスを解除して進んでください。

次に、以下のCapsuleクラス生成テンプレートをダウンロードします。

Capsule クラス生成テンプレート ver.0.1 for MyGeneration

解凍後、MyGenerationインストール先の Templates/PHP の中にでも入れてください。

いよいよ自動生成

まず、MyGenerationを起動するとDefault Settingsのダイアログがでていると思いますので、使用するデータベースのDSNを正しく設定しておいてください。接続テストもできるので接続が成功することを確認しておくと良いです。

起動後、File > Open から先ほどのテンプレートファイルを選ぶか、ドラッグ&ドロップして開きます。

開いたら、おもむろに F5 キーを押します。

Capsule出力ダイアログ

すると上のようなダイアログが表示されるので、出力指定をしてOKを押すとテーブルごとにディレクトリが作成されファイルが生成されているはずです。テーブルを選択しておかないとファイルが出力されないので注意が必要です。

おわりに

今回のコードを使ったサンプルプログラムを置いておきます。例のトピックスのテーブルからXMLを出力するだけのコードです。

Capsuleサンプルプログラム

実はこのCapsuleは、「PHPのフレームワークを作ってみる」の記事(まだ1回しか書いてませんが...)のMVCの M に相当するライブラリとなっています。そのうち書くと思われる2回目以降の記事で使うことと思います(汗)。

LINEで送る
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です