変数を使ってORDER BYで指定するカラムを動的に変えようとしたらうまくいかなかった

変数に格納されている値によってSQLのORDER BY句を変化させてみよう、と思ったらうまくいかなかったのでその時のメモです。
また、ここではキャッシュの使用ついては考えません。ちなみにLaravelを使ってます。

php - How do I set ORDER BY params using prepared PDO statement? - Stack Overflow

この辺を参考にしてます。

うまくいかなかったケース

何も考えずにプリペアドステードメンドでカラム名を動的に変化させようとしてました。
こんな感じです。

ORDER BY :column

リテラル以外の部分をでプレースホルダで表現することはできません。

うまくいくケース

SQLで取得した結果をPHP側で並び替える

今回は適当にメソッドを作成してLaravel側で処理することにしました。

$result = sortBy($result,$column,$order);

public static function sortBy($collection, $column, $order){
    if($order === SORT_ORDER_DESC){
        return collect($collection)->sortByDesc($column);
    }else{
        return collect($collection)->sortBy($column);
    }
}

他にも以下の様なやり方があるみたいです。

プログラマ側で定義した値を使用してPHP側でSQL文を生成する(上記URLから引用)

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$order=$orders[$key];
$query="SELECT * from table WHERE is_live = :is_live ORDER BY $order";

SQL文内で条件分岐する(上記URLから引用)

order by
    case :column
        when 'colFoo' then colFoo
        when 'colBar' then colBar
        else colDefault
    end