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してあげれば完成。