Propel
メジャーなWebアプリケー諸フレームワークの1つであるsymfonyが1つ前のマイナーバージョンである1.2の時にデフォルトとして採用していたORMです。2、3年前まではPHPのORMと言えばPropelが定番という感じがありましたが、今はDoctrineの方が定番になっています。
特徴
PropelはあらかじめデータベーススキーマをXML形式で準備しておき、そのXMLファイルからORMのクラスを生成します。そのXMLファイルはDBDesignerから自動変換できます。もし、DBDesignerでスキーマを作成していなくても、DBDesigner上で既存のスキーマからリバースエンジニアリングし、DBDesignerでXMLを保存できます。
Propelを利用するためにはlibxml2とPhingをインストールしておく必要があり、環境構築に多少手間がかかります。PhingとはGNU makeやApache ANTのビルドツールをPHPで実装したソフトウェアです。
実行例
以下に実行例を記載します。
<?php
// propelライブラリを読み込む
require_once 'lib/vendors/propel/runtime/lib/Propel.php';
// データベース、ORMの設定を読み込む
Propel::init("./orm/build/conf/orm-conf.php");
// クラスの場所を設定する
set_include_path("./orm/build/classes" . PATH_SEPARATOR . get_include_path());
// データベースへ接続
$conn = Propel::getConnection();
<?php
// 設定を読み込む
require_once 'bootstrap.php';
// Authorオブジェクトを生成
$author = new Author();
$rand = rand(1, 10000);
$author->setName('name-'.$rand);
$author->setPassword(sha1('password-'.$rand));
$author->save($conn);
// ユーザオブジェクトを取得
$id = $author->getId();
$author = AuthorQuery::create()->findPK($id);
// パスワードを変更し、更新
$author->setPassword(sha1('newpassword-'.rand(1,100000)));
$author->save();
// Authorを削除
$author->delete();
プログラムのコードはDoctrineと同じような記述ができます。Doctrineに比べるとORM用にXMLファイルを準備しなければいけない点などでメンテナンス性が劣ります。
php-activerecord
プロジェクト名が意味するとおりActive Recordモデルを実装しているORMです。外部キーの保持、値のバリデーション、データ操作の前処理、後処理を効率的に行うコールバックを実装しています。
特徴
DoctrineやPropelと比べると機能は少なくなりますが、充分にデータベースを抽象化しているので小規模、中規模の開発に適しています。
php-activerecordの利点はスキーマにあわせたコードのファイルの生成が不要である点です。よって、スキーマの変更のたびにORM用のクラスを再生成する必要はありません。その代わり、PDTやPHPEclipseなどの統合開発環境でメソッドのオートコンプリートを行えません。
実行例
以下に実行例を記載します。
<?php
// ライブラリの読み込み
require_once 'lib/vendor/php-activerecord/ActiveRecord.php';
// データベース接続先の設定
ActiveRecord\Config::initialize(function($cfg)
{
$cfg->set_model_directory('models');
$cfg->set_connections(array(
'development' => 'mysql://orm@192.168.0.40/orm'));
});
<?php
// 設定の読み込み
require_once 'bootstrap.php';
// authorを追加
$author = Author::create(array('name' => 'Test', 'password' => sha1('pasword-'.rand(1, 100000))));
// Authorオブジェクトを取得
$author = Author::find($author->id);
// パスワードを変更し、更新
$author->password = sha1('newpassword-'.rand(1,100000));
$author->save();
// Authorを削除
$author->delete();
基本的にはDoctrineやPropelと同じようにActive Recordモデルでコードを記述できますが、データの追加の際には配列による指定を行わなければならないため、DoctrineやPropelに比べて提供する機能の抽象度が下がります。
