CakePHP findで取得する関連データを選別

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

カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です