J'ai un tableau d'ID comme suit:
$ids = [5,6,0,1]
En utilisant Eloquent, je peux rechercher ces identifiants à l'aide de la fonction ->whereIn('id', $ids)
. Cela, comme prévu, renverra les résultats dans l'ordre croissant par Id, est-il possible de renvoyer les résultats dans l'ordre dans lequel le tableau est? quelle est la meilleure façon de convertir la collection dans l'ordre du tableau $ids
?
S'il y a un ordre spécifique dans lequel vous souhaitez les enregistrements, vous devez utiliser Méthodes de collecte :
Pour obtenir vos identifiants dans l'ordre très spécifique que vous avez spécifié, vous pouvez utiliser la méthode sortBy
comme suit, où collection est votre collection de modèles:
$ids = [ 5, 6, 0, 1];
$sorted = $collection->sortBy(function($model) use ($ids) {
return array_search($model->getKey(), $ids);
});
// [ 5, 6, 0, 1] // (desired order)
Pour randomiser votre collection, vous pouvez utiliser la méthode shuffle
.
$collection = collect([1, 2, 3, 4, 5]);
$shuffled = $collection->shuffle();
$shuffled->all();
// [3, 2, 5, 1, 4] // (generated randomly)
Voir Laravel Docs sur shuffle
et/ou sortBy
pour des exigences plus spécifiques.
Si vous n'avez pas vraiment d'ordre spécifique à l'esprit, vous pouvez utiliser ->inRandomOrder()
dans la version 5.2 et plus, les anciennes versions nécessiteraient la requête brute à l'aide de ->orderBy(DB::raw('Rand()'))
.
Voir la réponse à ordre MySQL par champ dans Eloquent . Il est possible de classer les données dans votre requête SQL. D'autres réponses suggèrent ici de trier les données après les avoir récupérées dans un "mauvais" ordre.
Votre code devrait ressembler à ceci:
$ids = [5,6,0,1];
$collection = YourModel::whereIn('id', $ids)
->orderByRaw('FIELD (id, ' . implode(', ', $ids) . ') ASC')
->get();