system
マリンロード

2012.11.12システム開発 

マリンロード

[CakePHP]複数テーブルのPagenationでソートする

前回はCakePHPで「複数テーブルでPagenationする」方法について紹介しました。 今回は前回の内容と密接に結びついているのですが、 複数テーブルのPagenationでソートする方法を紹介します。 CakePHPのPagenagorでは親テーブル以外のJOINしたテーブルのカラムに対してソートの指定ができません。 virtualFieldsを使用するとできるようですが、 弊社ではCakePHPを以下のようにカスタマイズして 複数テーブルのPagenationでソートする方法を実現しています。 ◆弊社利用CakePHPVer. 2.1.1 1.CakePHPのコアライブラリPagenatorコンポーネントをカスタマイズ   修正ファイル:/CakePHP2.1.1/lib/Cake/Controller/Component/PaginatorComponent.php(350行目付近)

$direction);     }     if (!empty($whitelist) && isset($options[‘order’]) && is_array($options[‘order’])) {       $field = key($options[‘order’]);       if (!in_array($field, $whitelist)) {         $options[‘order’] = null;       }     }     if (!empty($options[‘order’]) && is_array($options[‘order’])) {       $order = array();       foreach ($options[‘order’] as $key => $value) {         $field = $key;         $alias = $object->alias;         if (strpos($key, ‘.’) !== false) {           list($alias, $field) = explode(‘.’, $key);         }         // REM 独自カラムソートカスタマイズ MarineRoad Inc.         // ※指定しているモデルに存在しないカラムでもソートができるように修正         if (method_exists($object, ‘paginate’)) {           // 独自SQLによる「pagenate」メソッドがモデルの存在する場合のみ、           // 指定されたフィールド名をそのまま指定する           $order[$key] = $value;         } else {           if ($object->hasField($field)) {             $order[$alias . ‘.’ . $field] = $value;           } elseif ($object->hasField($key, true)) {             $order[$field] = $value;           } elseif (isset($object->{$alias}) && $object->{$alias}->hasField($field, true)) {             $order[$alias . ‘.’ . $field] = $value;           }         }       }       $options[‘order’] = $order;     }     return $options;   } 2.前回を参考にクエリを書くモデルを準備

3.コントローラーから利用

  $this->paginate = array(‘Member’ => array(     ’conditions’ => array(‘member.member_id >’ => ’10’),     ’limit’ => 10,     ’order’ => array(‘member_address’ => ‘asc’),     ’recursive’ => 1,     ’originalSql’ => $this->Member->getMemberList(),     ’params’ => array(),   )   );

どうでしょう? 以上です。ではまた。

システム開発サービスはこちら
ページTOPへ