次のようなIDの配列があります。
_$ids = [5,6,0,1]
_
Eloquentを使用すると、->whereIn('id', $ids)
関数を使用してこれらのIDを検索できます。これは期待どおりにIDの昇順で結果を返しますが、配列の順序で結果を返す方法はありますか?あるいは、_$ids
_配列の順序でコレクションを変換する最も簡単な方法は何ですか?
レコードを入れたい特定の順序がある場合は、 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()'))
を使用した生のクエリが必要になります。
EloquentのフィールドによるMySQLの順序 の回答を参照してください。 SQLクエリでデータを並べ替えることができます。ここでの他の答えは、「間違った」順序ですでにフェッチした後にデータをソートすることを提案しています。
コードは次のようになります。
$ids = [5,6,0,1];
$collection = YourModel::whereIn('id', $ids)
->orderByRaw('FIELD (id, ' . implode(', ', $ids) . ') ASC')
->get();