edo1z blog

プログラミングなどに関するブログです

cakePHP Paginator Sort 任意の順番でソートさせる

cakePHPのPaginatorのsort機能は便利だが、例えばフィールドに格納されている内容が、"非常に忙しい"、"忙しい"、"平均的"、"暇"、"すごく暇"といった文字列になっている場合、忙しい順に並べたいと思っても、cakePHPは日本語が読めないし、意味も分からないのだから難しい。

よって、何らかの対処が必要である。 参考にしたサイトは、下記4サイト。

http://snowland.net/nucleus/item/2984 MySQLはOrder byで任意の順番でソートすることが簡単にできる。

http://d.hatena.ne.jp/atcorp/20100213/p1 cakePHPのPaginatorは、毎回$model->beforeFindメソッドを2回実行する。

http://blog.kabadna.com/20110731-1297/ CakePHPのPaginatorに独自のパラメータを追加する方法がのっている。

https://groups.google.com/forum/?fromgroups=#!topic/cake-php/3968QIqsi8A cakePHPでのORDER BY FIELDの設定方法がのっている。

結論的には、ビュー上でソートしたいフィールドを指定された際に、sortパラメタにそのフィールド名を設定してコントローラーを呼び出し、コントローラー内で、sortパラメタの値(フィールド名)に応じて、$this->paginateに、ORDER BY FIELDを設定することで解決できた。

↓コントローラー内

$busy = array('非常に忙しい','忙しい','平均的','暇','非常に暇');

//paginatorのsort設定
if(isset($this->request->query['sort'])){
    if($this->request->query['sort'] == 'busy'){
        $this->paginate['order'] = "FIELD(busy, '" . implode("','", $busy)."')";
    }else{
        $this->paginate['order'] = array('Hospital.id' => 'desc');
    }
}else{
    $this->paginate['order'] = array('Hospital.id' => 'desc');
}
//デフォルトのpaginatorのorderを解除
unset($this->request->query['sort']);