У меня есть массив идентификаторов:
$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 });