[Laravel] ORDER BYで指定するカラムを変数で動的に変えたい時の対処法

2019年4月2日ITLaravel, PHP

DBファサードのクエリ内で order by で指定するカラムを動的に変えようとしたのですが、そのまま当てると思った通り動かったので、対処法を調べました。

[検証環境]
PHP 7.2.4
MySQL 5.7.22
Laravel 5.6.26

参考:
変数を使ってORDER BYで指定するカラムを動的に変えようとしたらうまくいかなかった
How do I set ORDER BY params using prepared PDO statement?

現象

テーブルにこんなデータが入ってるとします。

dynamic-var-using-in-orderby1.png

下記のように書いて、画面側での表示確認をすると、、

$column = 'id';
$users = DB::select(
    'select * from users order by ? desc', [$column]
);

debugbar のクエリに desc には出力されていますが、出力結果は降順になっていません。

dynamic-var-using-in-orderby2.png

対応法

対応としては、下記が考えられると思いますが、
1. order by の後に case文を書く
2. クエリで取得してから、PHP側で並べ替える
3. 動的にカラムを指定するのを諦めて、1つ1つ真心込めて、静的に指定する

今回は 1 を試してみました。

検証

1. order by の後に case文を書く(※ else は省いています。)

$column = 'id';
$users = DB::select(
    'select * from users order by
        case ?
            when "id" then id
        end
    desc'
    , [$column]
);

これで結果は、降順になりました。

dynamic-var-using-in-orderby3.png

以上になります。

ひとこと

order by の後に case 文でカラムを指定する書き方がいいのか悪いのかは追って調べる予定です。ただ、動的にしないと似たようなメソッドをいくつも追加しなければいけないのでそれはそれでツラく、、あぁ

スポンサーリンク

Posted by nobuhiro harada