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