Сортировка коллекции по индивидуальному заказу в Eloquent

У меня есть массив идентификаторов:

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

Использование Eloquent Я могу найти эти идентификаторы, используя ->whereIn('id', $ids) . Это, как и ожидалось, вернет результаты в порядке возрастания по Id, есть ли способ вернуть результаты по порядку, в котором находится массив? альтернативно, самый простой способ конвертировать коллекцию в порядке массива $ids ?

Если есть определенный порядок, в который вы хотели бы включить записи, вам придется использовать методы коллекции :

Чтобы получить идентификаторы в указанном вами конкретном порядке, вы можете использовать метод 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) 

См. Laravel Docs для shuffle и / или sortBy для получения более конкретных требований.

Если у вас действительно нет определенного порядка, вы можете использовать ->inRandomOrder() в версии 5.2 и выше, для более старых версий потребуется необработанный запрос с помощью ->orderBy(DB::raw('RAND()')) .

Вы можете передать функцию в метод sortBy для выполнения сложной сортировки:

 $ids = [5,6,0,1]; $collection = YourModel::whereIn('id', $ids)->sortBy(function($model) use ($ids) { // Access your array order here and modify the sorting here });