インソースマーケティングデザイン
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(), ) );
どうでしょう? 以上です。ではまた。