モデルで定義したアソシエーション等をコントローラーで変更したい

CakePHP いまさらですが触ってます、、

今回は、モデルの使い回しをする際にはまってしまったTipsです。

例えば、商品画面では詳細な情報が必要だからと、ありとあらゆる関連テーブルをモデルでアソシエーションするとします。

検索画面で一覧表示したいからとそのモデルをそのまま使うと当然ですが件数が多くなってきたり、関連テーブルがたくさんあるとオモオモです。

そんな時は、Controller内の任意の関数も変更ができます。
これが出来ないと、検索用には SearchItem モデル、、なんていうのを作らなくてはならないです

そういう時に使える候補は3つ

1,オプションにて recursive  -1 ~ 2

$this->Item->find('all',array('recursive' => -1));

2,Containableビヘイビア

//Modelにてビヘイビアを設定しておく

public $actsAs = array('Containable');

///Controllerにて
//全て取得しない
$this->Item->contain();
$this->Item->find('all);

//hoge1モデルのデータのみ
$this->Item->contain('Hoge1');
$this->Item->find('all');

 

3,bindModel,unbindModel をつかう

        //アソシエーションの整理
        $this->Item->unbindModel(array(
            'belongsTo' => array('HogehoeBelongsTo'),
            'hasMany' => array('Hoge1', 'Hoge2', 'Hoge3'),
            'hasAndBelongsToMany' => array('HogeHasAndBelongsToMany')
                ), false);

上記、最後の false をセットしないと、Paginatorとかを活用するときにModelで定義されたAssociation状態に戻ってしまいます。

//もちろん追加もできる、書式はunbindModel と同じ
$this->Item->bindModel(array(),false);

 

こんな感じです

ちなみに、例えばその関連テーブルからデータを取りたいんだけど条件を付けたい、、みたいな場合も直接コントローラーから直接変更できます。

   //関連テーブルにて追加の検索条件
 $this->Item->hasMany['Hoge1']['conditions'] = array('Hoge1.category_id = 1');

 

とりあえず、こんなかんじで(^^

 


コメントを残す

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

About Me

Nobody knows

Featured Posts