この発見によりかなり使えるものになりそう。
例えば、Theme hasMany(1対多) Itemの関係である時、
検索時に一つのThemeにつらなる複数のItemの数や
順序について、コントロールできないと思っていた。
だけど、下記のページを見て、hasManyの属性に値を設定すれば
コントロールできることがわかった。
How to limit number of records from associated model
下記の3行目、4行目にlimitとorderを設定した。
//in the themes_controller.php public function search(){ $this->Theme->hasMany['Item']['limit'] = 2; $this->Theme->hasMany['Item']['order'] = 'Item.id asc'; $this->Theme->unbindModel(array('belongsTo'=>array('User')),false); if(!empty($this->data)){ $skey = $this->data['Theme']['content']; $data = $this->paginate('Theme',array('Theme.content like'=>"%".$skey."%" )); $this->set('data',$data); } }すると、下記のようにItemの数が二つに制限されidの降順となった。
//検索された配列をprint_rした結果 [0] => Array ( [Theme] => Array ( [id] => 1 [content] => 秋に読みたい本 [explanation] => 芸術の秋にはどんな本が合うでしょうか [user_id] => 2 [created] => 2012-09-01 [modified] => 2012-09-01 ) [Item] => Array ( [0] => Array ( [id] => 14 [code] => 4844362046 [theme_id] => 1 [rank] => 11 [created] => 2012-09-08 [modified] => 2012-09-08 ) [1] => Array ( [id] => 13 [code] => 4844362046 [theme_id] => 1 [rank] => 10 [created] => 2012-09-08 [modified] => 2012-09-08 ) )
hasManyとbelongsToの使い分けだが、まとめると現状以下のように理解している。
・hasMany
1対多関係において、”1”側の項目で検索をする際、
それにつらなる”多”側の取得結果にソートや数制限をしたい場合。
・belongsTo
1対多関係において、”多”側の項目で検索をしたい場合。
hasManyとbelongsToは1対多の関係をどちら側から見るかの違いしかなく、
使いようで大体同じことができるんでしょ う、と最初思っていたが、
特徴がそれぞれあって、使い分ける必要があり、
わかれば便利に使えるということがわかってきた。
※CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zip
0 件のコメント:
コメントを投稿