この発見によりかなり使えるものになりそう。
例えば、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 件のコメント:
コメントを投稿