web-dev-qa-db-ja.com

Eloquentでカスタム順でコレクションを並べ替える

次のようなIDの配列があります。

_$ids = [5,6,0,1]
_

Eloquentを使用すると、->whereIn('id', $ids)関数を使用してこれらのIDを検索できます。これは期待どおりにIDの昇順で結果を返しますが、配列の順序で結果を返す方法はありますか?あるいは、_$ids_配列の順序でコレクションを変換する最も簡単な方法は何ですか?

12
InvalidSyntax

レコードを入れたい特定の順序がある場合は、 Collection Methods を使用する必要があります。

指定した特定の順序でIDを取得するには、次のようにsortByメソッドを使用できます。ここで、コレクションはモデルのコレクションです。

_$ids = [ 5, 6, 0, 1];

$sorted = $collection->sortBy(function($model) use ($ids) {
    return array_search($model->getKey(), $ids);
});

// [ 5, 6, 0, 1] // (desired order)
_

コレクションをランダム化するには、shuffleメソッドを使用できます。

_$collection = collect([1, 2, 3, 4, 5]);

$shuffled = $collection->shuffle();

$shuffled->all();

// [3, 2, 5, 1, 4] // (generated randomly)
_

より具体的な要件については、shuffleまたはsortByの-​​ Laravel Docs を参照してください。

特定の順序を特に意識していない場合は、バージョン5.2以降で->inRandomOrder()を使用できます。古いバージョンでは、->orderBy(DB::raw('Rand()'))を使用した生のクエリが必要になります。

12
Stephen Lake

EloquentのフィールドによるMySQLの順序 の回答を参照してください。 SQLクエリでデータを並べ替えることができます。ここでの他の答えは、「間違った」順序ですでにフェッチした後にデータをソートすることを提案しています。

コードは次のようになります。

$ids = [5,6,0,1];

$collection = YourModel::whereIn('id', $ids)
    ->orderByRaw('FIELD (id, ' . implode(', ', $ids) . ') ASC')
    ->get();
3
Luka Peharda