CakePHPの「OrderedBehavior」と「TreeBehavior」はマジで使うべき
あまり知られてなさそうだけど、マジで便利に使えるCakePHPのビヘイビアを2つ紹介します。
OrderedBehavior
http://bakery.cakephp.org/articles/alkemann/2008/09/21/orderedbehavior-2-1
順序を管理するビヘイビアです。Webアプリケーションを作っていると、多くの局面で、
「順序を自由に入れ替えたいんだけど...」
という機能要望が上がります。DBの仕様としては順序を振ってソートするだけでよいのですが、愚直にDBを操作しようとするとすごくめんどくさいです。順序番号の振りなおしとか、うわーやってらんねー、ってなります。
そんなめんどくさい実装も、OrderedBehaviorを使えば、超簡単にできます。
例えば「ある行を1つ上に上げる」という操作。これなら、メソッド1発です。
$this->Model->moveup($id);
もうひとつ、「ある条件でソートし直す」という操作。例えば作成日とかで一括で振りなおしとか。これも、メソッド一発です。
$this->Model->sortby('Model.created DESC', $group_id);
もちろん行が追加(save)されたときや削除(del)されたときも自動でよしなに振ってくれます。いやー便利ですね。
TreeBehavior
http://book.cakephp.org/view/1339/Tree
ツリー構造を管理するビヘイビアです。CakePHP本体に搭載されてます。
このビヘイビア、実装内容を知るまでは、「親IDを持たせて再帰する、遅そうなビヘイビアなんでしょ…?」と思ってたのですが、ところがどっこい、再帰不要なアルゴリズムを使用した実装でした。
この実装はピンとこないときは理解するのに苦しむのですが、理解してしまえば「はっはーーなるほどー、これならインデックスが効きやすくて、MySQLでも速いわこれ!」って思います。ってか思いました。
僕の知る限りで最もわかりやすい説明が「ウノウラボ by Zynga Japan: RDBで階層構造を扱うには?」ですので、実装内容を知りたい方は、読んでみてください。
で、肝心の使用例ですが、これもまたシンプルです。
ツリー要素の追加自体は、親IDを指定して保存するだけです。
$this->Model->save(array('name' => 'new record', 'parent_id' => $parent_id));
ある要素の子孫一覧を取り出したり。
$this->Model->children($id);
ツリー内の兄弟要素での順序も操作したり。(OrderedBehavior不要)
$this->Model->moveup($id);
他にも様々な形式で一覧を取り出せたりして、便利です。
ビヘイビアを沢山知っておくとコントローラやモデルのコードがかなりすっきりするので、CakePHPに慣れてきたらいろいろ物色してみるとよいです。ビヘイビア同士の相性問題もちらほらありますが、どれか1つ使うだけなら大抵うまく動作してくれますよ。
( このエントリはCakePHP Advent Calendar 2011の19日目の参加記事です。他の方の記事もぜひどうぞ )
コメント / トラックバック