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']);