[CakePHP2]Null の含まれるカラムをPaginatorで思い通りにソートする

たとえば、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が最後に出現

が実現できます。

凄く無駄っぽい実装ですが、分かり易さ第一という事で。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です