web-dev-qa-db-fra.com

Comment obtenir des valeurs distinctes pour les champs de colonne non-clés dans Laravel?

Cela peut être assez facile mais vous ne savez pas comment.

J'ai une table qui peut avoir des valeurs répétées pour un champ de colonne non-clé particulier. Comment puis-je écrire une requête SQL à l'aide de Query Builder ou de Eloquent qui extraira des lignes avec des valeurs distinctes pour cette colonne?

Notez que je ne récupère pas uniquement cette colonne, elle est associée à d'autres valeurs de colonne. Il est donc possible que distinct() ne fonctionne pas vraiment. Donc, cette question peut être de savoir comment spécifier la colonne que je souhaite distinguer dans une requête maintenant que distinct() n'accepte aucun paramètre?

60
gthuo

Vous devriez utiliser groupby. Dans Query Builder, vous pouvez le faire comme suit:

$users = DB::table('users')
            ->select('id','name', 'email')
            ->groupBy('name')
            ->get();
87
Marcin Nabiałek

Dans Eloquent, vous pouvez également interroger comme ceci:

$users = User::select('name')->distinct()->get();

52
Pathros

en éloquent, vous pouvez utiliser cette

$users = User::select('name')->groupBy('name')->get()->toArray() ;

groupBy est en train d'extraire les valeurs distinctes. En fait, le groupe groupera les mêmes valeurs afin que nous puissions utiliser des fonctions d'agrégat sur celles-ci. mais dans ce scénario, nous n'avons pas de fonctions d'agrégat, nous sélectionnons simplement la valeur qui donnera le résultat à des valeurs distinctes

22
Salar

Bien que je sois en retard pour répondre à cette question, une meilleure approche pour obtenir des enregistrements distincts en utilisant Eloquent serait:

$user_names = User::distinct()->get(['name']);
13
rsakhale

Notez que groupBy comme utilisé ci-dessus ne fonctionnera pas pour postgres.

Utiliser distinct est probablement une meilleure option - par exemple. $users = User::query()->distinct()->get();

Si vous utilisez query, vous pouvez sélectionner toutes les colonnes comme vous le souhaitez.

5
jec006

Le regroupement par ne fonctionnera pas si les règles de la base de données n'autorisent aucun des champs sélectionnés à être en dehors d'une fonction d'agrégat. Utilisez plutôt les collections laravel .

$users = DB::table('users')
        ->select('id','name', 'email')
        ->get();

foreach($users->unique('name') as $user){
  //....
}
4
Jed Lynch

$users = User::select('column1', 'column2', 'column3')->distinct()->get(); récupère les trois colonnes pour des lignes distinctes dans la table. Vous pouvez ajouter autant de colonnes que vous le souhaitez.

3
Mark-Hero
$users = Users::all()->unique('name');
1
Roland Verner