4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LaravelのwhereInを使って、配列の並び順に並び替える方法。

Posted at

WhereInは勝手に昇順で並び替えられてしまう。

例えば下記を見てください。

$ids = array(1,5,2,4,3);
$users = User::whereIn('id', $ids)->get();

dd($users);

上記のようにすれば、user1,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してあげれば完成。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?