たとえば、priceカラムがあるとして、
nullが入ってるデータにソートをかけると、
一番低い値としてみなされます(mysqlの場合)。
安い順に並べたいのに、そんなわけの分からないデータが表示されたら困ります。
※かといって、逆に、高い順に並べたときにnullデータが最初に表示されても困ります。
そんな場合のテヒニク(ドイツ語?)
VirtualFieldsでサクッと解決する
予めソート対象のカラムに細工をして、空想列を作る。
1 2 3 4 5 6 | public $virtualFields = array( // 昇順の場合はnull を最大値として扱う 'asc_price' => 'ifnull(price, 2147483647)', // 想定される上限より上の値 // 降順の場合はnull を最小値として扱う 'desc_price' => 'ifnull(price, -1)', // 想定される下限より下の値 ); |
View側では普通にPaginator::sortを
1 2 | echo $this->Paginator->sort('asc_price', '安い順', Array('direction' => 'asc'); // asc echo $this->Paginator->sort('desc_price', '高い順', Array('direction' => 'desc'); // desc |
これで、
- 安い順に並べた場合にnullが最後に出現
- 高い順に並べた場合にもnullが最後に出現
が実現できます。
凄く無駄っぽい実装ですが、分かり易さ第一という事で。