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