2012年9月11日火曜日

[CakePHP]hasManyで関連先の取得レコードのソートや数制限する方法

アソシエイションのhasManyは使えないものと思っていたけど
この発見によりかなり使えるものになりそう。

例えば、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 件のコメント:

コメントを投稿