PHP
CakePHP 1.3
CakePHP findで取得する関連データを選別
CakePHPのよいところは、関連するデータを簡単に取得できるところですが、時に多くの関連データを取得してきたり、または取得したいデータを取得できなかったり、自由が効きません。
しかし!containerというビヘイビア(コンテイナブル)を使えば、両方の悩みが解決します。
次のようなモデルがあるとします。
クラス名:Student(弟子) テーブル名:students id name 1 孫悟空 2 ヤムチャ 3 天津飯
クラス名:Teacher(師匠) テーブル名:teachers id name 1 亀仙人 2 桃白白 3 カリン様
クラス名:Teacherskill(師匠の必殺技) テーブル名:teacherskills id name 1 かめはめ波 2 どどん波 3 体力回復
Studentは多くのTeacherを持つことができ、Teacherは一つのTeacherskillを持っています。
他にも多くのStudentAddress(弟子の住所)などの複雑なデータ構造があるとします。
さて、Studentクラスから、Teacherskillの名前を取得しようとします。
デフォルトのfindを利用した取得はかなり複雑で、多くの関連データを取ってきてしまいます。
今までは、それを制御するのにrecursiveや、unbind、bindを利用していましたが、それより簡単です。
コンテイナブルを利用して、次のように書けます。
//students_controller内 $this->Student->Behaviors->attach('Containable'); $this->Student->find('all', array('contain' => array( 'Teacher' => array( 'Teacherskill' ) ) ) );
参考:
http://book.cakephp.org/ja/view/1323/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%A4%E3%83%8A%E3%83%96%E3%83%AB