CakePHP2.3.6 paginatorのソート(ORDER BY)で、NULL値を後にする方法。
2015/01/11
一覧(ページングあり)データを取得する時に、順序用カラムがNULLの場合はNULLが先に来て、1番データ、2番データ・・・と続きます。
NULL値を数値のあとに表示させたいって場合はどうするのか、というのを調べると、
MySQLでは ORDER BY に IS NULL を指定すれば可能
です。
例を挙げるとこんな感じ。
sort_order カラムに、順序用数値があるとします。
1 |
SELECT * FROM members ORDER BY 'sort_order' IS NULL, 'sort_order' ASC; |
で、これをCakePHP2.3.6で指定しようとすると、多分、こう書けばOK・・・。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$order = array( 'Member.sort_order' => 'IS NULL', 'Member.sort_order' => 'ASC', ); $this->paginate = array( 'Member' => array( 'conditions' => $conditions, 'limit' => $limit, 'order' => $order, 'recursive' => -1, ) ); |
だと思ったのですが、全然うまく行きません。
'Member.sort_order' => 'ASC' の方はSQLとして認識してくれるのですが、 IS NULL の方はさっぱり。
何でやなんでやとあれこれやった結果、以下の書き方ではうまくいきました。
1 2 |
// NULLを後にする場合は、配列ではなく文字列で指定! $order = 'Member.sort_order IS NULL, Member.sort_order ASC'; |
SQL文を文字列で渡すと正常動作。
結果を見た時、マジで吹き出しました。
なんなんだそりゃ。
普通は配列で渡すと思うやん! 数時間費やしてしまいましたよ・・・。
結論
// NULLを後にする場合は、配列ではなく文字列で指定!
[tgAmazonItemLookup asin="B00646YVTK" related="1"]