WhereInは勝手に昇順で並び替えられてしまう。
例えば下記を見てください。
$ids = array(1,5,2,4,3);
$users = User::whereIn('id', $ids)->get();
dd($users);
上記のようにすれば、user
は1,2,3,4,5
の順番で並び替えられてしまいます。
これだと色々と不都合な時がある。
そのため、ちょっと工夫する必要があります。
WhereInを使って、配列順にソートしたい時
結論からいうと、下記のようにすればOK。
$ids = array(1,5,2,4,3);
$placeholder = '';
foreach ($ids as $key => $value) {
$placeholder .= ($key == 0) ? '?' : ',?';
}
$users = User::whereIn('id', $ids)->orderByRaw("FIELD(id, $placeholder)", $ids)->get();
dd($users);
こんな感じにすれば、きちんと1,5,2,4,3
の順番でuser
を取得できます。
少し解説していきます。
foreachの中身
まずはforeach
の中から。
$placeholder .= ($key == 0) ? '?' : ',?';
は文字列を作成しています。
$placeholder
の中身は"?,?,?,?,?"
こんな感じになっており、次で使います。
orderByRawメソッド
orderByRawメソッド
は要するに好きなようにSQL文を書いて、並び替えができるよってメソッドです。
第一引数にはSQL文、第二引数にはバインドしたい値を書けばOK。
FIELDメソッド
FIELDメソッド
はSQL側のメソッドで、第一引数に並び替え対象のカラム、第二引数に並び替えたい順番を書けばOK。
今回の場合は"FIELD(id, $placeholder)"
とすることで、idカラム
で対象としています。
そして、$placeholder
は現在"?,?,?,?,?"
こんな文字列になっています。
そのため、第二引数に$ids
を指定することで、Laravel側がバインドしてくれて、いい感じにしてくれます。
そして、最後はget
してあげれば完成。