CakePHPの「OrderedBehavior」と「TreeBehavior」はマジで使うべき

あまり知られてなさそうだけど、マジで便利に使えるCakePHPのビヘイビアを2つ紹介します。

OrderedBehavior

OrderedBehavior (2.1) | The Bakery, Everything CakePHP
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

Tree :: Core Behaviors :: The Manual :: 1.3 Collection
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日目の参加記事です。他の方の記事もぜひどうぞ )

コメント / トラックバック

コメントは受け付けていません。