web-dev-qa-db-fra.com

Trier la collection par commande personnalisée dans Eloquent

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?

12
InvalidSyntax

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()')).

12
Stephen Lake

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();
3
Luka Peharda