Comment obtenir des valeurs distinctes pour les non-colonne de la clé des champs dans Laravel?
Cela peut être assez facile, mais n'ont aucune idée de comment.
J'ai une table qui peut avoir des valeurs répétées pour un particulier non-colonne de clé de champ. Comment puis-je écrire une requête SQL en utilisant le Générateur de Requêtes ou Éloquent qui va extraire les lignes avec des valeurs de cette colonne?
Remarque que je ne suis pas aller chercher cette colonne, il est en conjonction avec d'autres valeurs de la colonne, de sorte distinct()
peut pas vraiment travailler. De sorte que la question de coeur peut être la façon de spécifier la colonne que je veux être distinct dans une requête maintenant que distinct()
accepte pas de paramètres?
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
groupby
. Dans le Générateur de Requêtes, vous pouvez le faire de cette façon:where()
de casse, comment puis-je résoudre ce problème?Dans Éloquent vous pouvez également effectuer une requête comme ceci:
$users = User::select('name')->distinct()->get();
Note that I am not fetching that column only, it is in conjunction with other column values
$users = User::select('column1', 'column2', 'column3')->distinct()->get();
dans éloquent, vous pouvez utiliser cette
groupBy est en fait aller chercher les valeurs distinctes, en fait, le groupBy classera les mêmes valeurs, de sorte que nous pouvons utiliser des fonctions d'agrégation sur eux. mais dans ce cas, nous n'avons pas de fonctions d'agrégation, nous sommes juste en sélectionnant la valeur qui sera la cause de la conséquence d'avoir des valeurs distinctes
in_array()
fonction, ça ne fonctionne jamais. Pour le fixer, j'ai essayé->lists()
au lieu (Version 5.2). Donc,$users = User::select('name')->groupBy('name')->lists('name');
a bien fonctionné pour phpin_array()
;Si je suis en retard pour répondre à cette question, une meilleure approche pour obtenir distinct des enregistrements à l'aide Éloquent serait
get()
méthode (et j'ai testé aussi lefirst()
méthode), ce qui est équivalent à l'utilisation de laselect()
méthode comme le montrent quelques réponses ici. Bien que quelque peugroupBy
semble encore le score le plus élevé. Mais ce serait vraiment distincte si c'est la seule colonne, je suis la sélection.Noter que
groupBy
utilisé ci-dessus ne fonctionne pas pour postgres.À l'aide de
distinct
est probablement une meilleure option - p. ex.$users = User::query()->distinct()->get();
Si vous utilisez
query
vous pouvez sélectionner toutes les colonnes comme demandé.$users = User::select('column1', 'column2', 'column3')->distinct()->get();
récupère tous les trois coulmns pour les différentes lignes dans le tableau. Vous pouvez ajouter autant de colonnes que vous le souhaitez.Le regroupement ne fonctionnera pas si la base de données de règles ne permettent de sélectionner les champs à l'extérieur d'une fonction d'agrégation. Au lieu d'utiliser l' laravel collections.
Quelqu'un a fait remarquer que cela peut ne pas être grande sur le rendement pour les grandes collections. Je recommande l'ajout d'une clé de la collection. La méthode à utiliser est appelé keyBy. C'est la méthode simple.
La keyBy vous permet également d'ajouter une fonction de rappel pour des choses plus complexes...
Si vous avez à parcourir de grandes collections, l'ajout d'une clé pour résoudre le problème de performances.
J'ai trouvé cette méthode de travail très bien (pour moi) pour produire un tableau plat de valeurs uniques:
Si vous avez exécuté
->toSql()
sur ce générateur de requête, vous verrez qu'il génère une requête comme ceci:La
->pluck()
est gérée par éclairer\collection lib (pas via une requête sql).**
Testé pour Laravel 5.8
**
Puisque vous voulez obtenir toutes les colonnes de la table, vous pouvez collecter toutes les données, puis filtrer à l'aide de Collections de la fonction appelée Unique
ou
Pour plus d'informations vous pouvez consulter Laravel De Collecte De Documentations