Propelを単体で使う
PHP5専用のO/RマッパーにPropelというものがあります。
PHPのフレームワーク「symfony」の標準のO/Rマッパーとして有名ですが、単体で使っている人はあまり見かけない気がします。
今回は単体で使う方法を軽く説明しようと思います。
1.インストール
PEARコマンドでインストールするのが簡単です。
# pear channel-discover pear.phpdb.org # pear install phpdb/propel_generator # pear install phpdb/propel_runtime
なお、phingが必要なので、入っていない場合は事前に
# pear install channel://pear.phing.info/phing
で入れておいてください。
ログを記録する場合はLogが必要なので、
# pear install Log
で入れておいてください。(今回は不要です)
執筆時点でのPropelの安定バージョンは1.2です。
2.テーブル定義
PropelではXMLでテーブル構造を定義します。これにより、リレーションを含めたPHPオブジェクトが全て自動で生成されます。
今回は仮にbookmarkという簡単なアプリケーションにします(実際にアプリケーションは作成しません)。bookmarkというフォルダを作り、以下のファイルを作成します。
schema.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><database name="bookmark" defaultIdMethod="native">
<table name="bookmark" description="bookmark"> <column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="bookmark id"/> <column name="title" type="varchar" size="255" required="true" description="bookmark title"/> <column name="url" type="varchar" size="255" required="true" description="bookmark url"/> </table>
</database>
3.基本設定
ビルドに関する設定は以下のファイルで設定します。
build.properties
propel.project = bookmark propel.database = mysql propel.database.url = mysql://root@localhost/bookmark
また、これとは別に、実際のアプリケーションからの接続時の設定は以下のファイルを使用します。
runtime-conf.xml
<?xml version="1.0" encoding="UTF-8"?> <config> <propel> <datasources default="bookmark"> <datasource id="bookmark"> <adapter>mysql</adapter> <connection> <phptype>mysql</phptype> <database>bookmark</database> <hostspec>localhost</hostspec> <username>root</username> <password></password> </connection> </datasource> </datasources> </propel> </config>
このような仕様になっているのは、Propel自体がgeneratorとruntimeで分離しているからだと思われます。
ファイルを作成したら、mysqlでbookmarkという名前のデータベースを作成しておいてください。
4.オブジェクト作成
bookmarkフォルダで以下のコマンドを実行します。
% propel-gen .
するとbookmarkフォルダ以下に多数のファイルが生成されます。
実際にデータベースに投入するSQLファイルは、build/sql/schema.sqlになります。そのままmysqlに投げてもいいですが、
% propel-gen . insert-sql
でもデータベースに投入できます。(実際に行っていることは手動での挿入と同じだと思います)
propel-genの際に、
Execution of target "convert-props" failed for the following reason: /usr/share/pear/data/propel_generator/build-propel.xml:534:12: Cannot write parsed template: Unable to parse template ./templates/conf/Control.tpl: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead [phingcall] /usr/share/pear/data/propel_generator/build-propel.xml:534:12: Cannot write parsed template: Unable to parse template ./templates/conf/Control.tpl: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead
のようなエラーが出た場合は、
% export TZ=Asia/Tokyo
としてください。
5.実際に使う
index.php
<?phprequire_once('propel/Propel.php');
// $dir = dirname(__FILE__); // ルートフォルダであればこれでも取得できます $dir = '/path/to/bookmark'; set_include_path($dir.'/build/classes' . PATH_SEPARATOR . get_include_path());
Propel::init($dir.'/build/conf/bookmark-conf.php');
これが初期化部分になります。$dirは適宜変更してください。
require_once('bookmark/Bookmark.php');
使用するテーブルに対応するファイルを読み込みます。
この後に実際のコードを記述していきます。
・データを追加/保存する
$bookmark = new Bookmark(); $bookmark->setUrl('http://ryus.co.jp/'); $bookmark->setTitle('XOOPS Webサイト/イントラサイト制作、XOOPS モジュール開発/カスタマイズを専門に行っています。 - XOOPS専門-株式会社RYUS'); $bookmark->save();
これでINSERTになります。DBから取得したデータであればUPDATEになります。両者を特に気にする必要はありません。
・データを読み込む
$bookmark = BookmarkPeer::retrieveByPk(1); $url = $bookmark->getUrl(); $title = $bookmark->getTitle(); echo $url,$title,PHP_EOL;
読み込み系は"テーブル名Peer"クラスで行います。
retrieveByPkは、主キーからデータを取得します。
# 表示が化ける可能性があるので、適当な文字コードで表示してください。
・複数データ取得
$bookmarks = BookmarkPeer::doSelect(new Criteria()); foreach($bookmarks as $bookmark) { $url = $bookmark->getUrl(); $title = $bookmark->getTitle(); echo $url,$title,PHP_EOL; }
doSelectは条件付きで複数レコード取得します。引数のCriteriaは条件を指定するクラスなのですが、今回は無指定なので単にnewしたものをそのまま渡しています。
条件を指定する例としては、
$c = new Criteria(); $c->add(BookmarkPeer::URL, 'http://ryus.co.jp/'); $bookmarks = BookmarkPeer::doSelect($c);
のような感じになります。Criteriaの条件設定は細かいところまで手が届くようになっています。
6.まとめ
詳しくは公式のドキュメントが充実しているので、そちらを参照してください。
次期バージョンであるPropel1.3(symfony1.1で載る予定)ではcreoleからPDOになり、更なる機能強化が期待できます。
PHPのO/Rマッパーは他にもS2Dao.PHP5やDoctrineなど多数あるので、好みのものを利用するのがいいと思います。
RSS feed for comments on this post.
ƤˤϡޤȤդƤޤ
Ȥ
ʤߥȤդ뤳ȤϽޤ