注文の多いXOOPS屋 TOP現在のブログ旧スタッフblog アーカイブ
このページは 2007〜2008 年に公開していた「株式会社RYUS スタッフblog」のアーカイブです。内容は当時のものです。

Propelを単体で使う

2008/04/14 18:09   sato   カテゴリ: development, PHP

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


<?php

require_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(\'/\');
$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, \'/\');
$bookmarks = BookmarkPeer::doSelect($c);

のような感じになります。Criteriaの条件設定は細かいところまで手が届くようになっています。

6.まとめ
詳しくは公式のドキュメントが充実しているので、そちらを参照してください。
次期バージョンであるPropel1.3(symfony1.1で載る予定)ではcreoleからPDOになり、更なる機能強化が期待できます。
PHPのO/Rマッパーは他にもS2Dao.PHP5やDoctrineなど多数あるので、好みのものを利用するのがいいと思います。