CakePHP ContainableBehavior便利すぎ

notoです。

モデル間のアソシエーションが複雑な場合、findで取得するデータに無駄がある、取得したいデータが取得できないことがあります。 そんな時は、ContainableBehaviorを利用すると幸せになれますよ。

検証環境

  • CakePHP1.3.x

ContainableBehavior

このビヘイビアは find を実行するときに関連したモデルを選別したり限定したりするために使用します。コンテイナブル(Containable)は、データベース中の不要なものを削減し、アプリケーションの速度やパフォーマンスを改善します。このクラスを使うと、ユーザに対するデータの検索とフィルタを、美しく一貫した方法で行うこともできます。

複雑なモデル関連の場合、データを取得する際に、recursiveでスコープ(?)を広げたり、Modelをbind unbindします。 recursive 2か1か。あれキーがないって怒られてる。そんなことがあると思います。

そんなことを悩まずともContainableBehaviorを利用したらいいのです。

ContainableBehaviorを利用したフィルタリング

cookbookから引用させてもらいます。 モデル間のアソシエーションが次のようになっているとします。

1
User->Post->PostAttachment->PostAttachmentHistory->HistoryNotes

ContainableBehaviorを利用したフィルタリングの例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$this->User->find('all', array(
    'contain'=>array(
        'Post' => array(
            'PostAttachment' => array(
                'fields' => array('id', 'name'),
                'PostAttachmentHistory' => array(
                     'HistoryNotes' => array(
                         'fields' => array('id', 'note')
                      )
                 )
             )
        )
     )
));

containを指定し、その中で取得したいフィールド、フィルタリングしたい条件を追加していきます。 どのデータを取得したいのかコードから把握でき可読性もいいです。

ContainableBehaviorそんなのデフォルトで使うでしょ。常識的に考えてって方はこれからもContainableBehaviorを、ContainableBehavior知らなかった方は是非利用してみてください。

参考

CakePHP コンテイナブル

Comments