Takeshi Amano
p****@takes*****
2007年 12月 3日 (月) 16:59:59 JST
bossatamaさん
> CI+Propelの組み合わせは興味深いですね。
> ところで、CIには標準でもmodelsとactive recordがありますが、
> 簡単に言ってpropelのここが良いってところが知りたいです。
> CIのmodelsよりさらに使いやすいとなれば、MVCのアプローチを
> 推奨することが可能ですよね。現在のmodelsはCIではオプション扱い
> ですから。
Propel はJavaのTorqueをポートしたObject relational マッピング
ツールです。なんだか難しそうですが、要するにデータベースの各行を
オブジェクトとして扱えるようになります。
そうすることで、DB周りのコードを書く量が減りCIと組み合わせてかなり
楽々コーディングな日々が送れます。
propelについてあまり日本語の資料が少ないので、torqueでGoogle
検索でもしてもらえば日本語関係の資料が出てきましたのでそちらを参照
してもらってもいいと思います。
CIのモデルクラス周りは使ったことがないので比較対照というわけには
行きませんが、とりあえずPropel で何ができるか実例をいくつか紹介
します。
1. 行の新規追加、更新
例えばbookという本の情報が入っているテーブルに行を追加する場合は
$book = new Book();
$book->setTitle('blah blah2');
$book->setISBN('12345');
$book->save();
と書くだけで大丈夫です。既にある行を変更するには
$book = BookPeer::retrieveByPK($book_id);
$book->setISBN('12345');
$book->save();
と書くだけで変更できちゃいます。簡単でしょ?
2. 他のテーブルとのjoin
ここがPropelの醍醐味です。
上記のbookテーブルに加えてpublisher(出版社)テーブルが
n対1(book対publisher)の関係でつながっているとします。
1つの出版社が多数の本を出しているイメージですね。
それで特定の出版社が出版している本を求める場合
$publisher = PublisherPeer::retrieveByPK($publisher_id);
$books = $publisher->getBooks();
で各本を取ってこれます。
そして、各本のタイトルを求める場合はこんな感じで回します。
foreach ($books as $book) {
echo $book->getTitle();
}
ね簡単でしょ?
もう少し複雑にして各本にくっついているカテゴリーの名前を
求める場合は
foreach ($books as $book) {
echo $book->getCetegory()->getName();
}
でokです。
こういうコードの書き方になれるともう他のDBレイヤーでいちいち
SQLを書くのがいやになってきます。
当然複雑なSQLをベタ書きすることも可能です。最新のベータ版
1.3からはPDOという抽象レイヤーを使ってそういったSQLを書くよう
になりました。
あくまで今回は何ができるかと言う話だけをしましたが、どうやって
CIでPropelを使えるようになるかと言う話はTIPSで詳しく説明できれ
ばと思います。
Takeshi Amano
p****@takes*****