2010年10月19日火曜日

KohanaのORMについて徒然

http://gist.github.com/632600



KohanaオリジナルのORMはとってもシンプル。
シンプルすぎてそのまま使うと危険なほど。



いくつか実運用時に気になった点を修正したORMを上げてみました。



1) Column list


テーブル定義を動的にとるのがデフォルトとされています。
これは、Cakeとかでもそうだしまぁ問題ないですね。
ただ、なぜかコレがキャッシュされません。


SQL異常に多いなーと思って中見たら、
毎回show columns クエリー飛ばしているじゃありませんか。
ということでファイルに1日キャッシュ。


alterしたりしたあとはcacheディレクトリ削除すればよし。


2)Has many


デフォルトは、
$user->child->find_all();
のようにもう一回クエリを飛ばしなさいよ!ってことらしい。


Joinして絞り込みたい時もあるでしょうが。使いようだと思います。


なのでwith()を拡張して$user->with('child')でLeft joinさせます。
あまり負荷を考えるとよろしい作法ではないですが、
使いどころ次第かと思います。


3) 透過キャッシュ


せっかくrowオブジェクトを持っているのだから
レコード更新時にキャッシュ更新したり、
参照時にキャッシュからとったりは透過的にできるでしょう。


findはPKで参照している時しか対応しづらかったのでそこまでですが、
アプリ作る際に意識していればこれであらかたキャッシュは回せるかと思います。


save_with_cacheでselectしなおしているのがちょっとダサいが、
たいていの更新はもとのrow objectがloadedなので問題ないはず。




1 件のコメント:

  1. 書き忘れたけど、transaction用関数もMySQLだけとりあえず追加

    返信削除