Laravel Éloquent distincts() et count() ne fonctionne pas correctement
J'essaie donc d'obtenir le nombre de pid distincts sur une requête, mais la valeur renvoyée est fausse.
C'est ce que j'essaie de faire:
$ad->getcodes()->groupby('pid')->distinct()->count()
Ce qui renvoie la valeur "2", alors que la valeur qu'il devrait retourner, devrait être "1".
Comme solution de contournement, je fais ceci:
count($ad->getcodes()->groupby('pid')->distinct()->get())
Ce qui fonctionne bien et renvoie "1"
Existe-t-il une règle où count et distinct ne peuvent pas être sur la même requête? Je trouve la solution de contournement un peu "lourde", je voudrais faire fonctionner la requête originale :(
9 réponses
Ce qui suit devrait fonctionner
$ad->getcodes()->distinct('pid')->count('pid');
Quelqu'un d'autre rencontre ce post, et ne pas trouver les autres suggestions pour travailler?
Selon la requête spécifique, une approche différente peut être nécessaire. Dans mon cas, j'avais besoin soit de compter les résultats d'un GROUP BY
, par exemple
SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b)
Ou utiliser COUNT(DISTINCT b)
:
SELECT COUNT(DISTINCT b) FROM a
Après quelques perplexités, j'ai réalisé qu'il n'y avait pas de fonction Laravel intégrée pour cela. Donc la solution la plus simple était d'utiliser DB::raw
avec count
méthode.
$count = $builder->count(DB::raw('DISTINCT b'));
Rappelez-vous, n'utilisez pas groupBy
avant d'appeler count
. Vous pouvez appliquer groupBy
plus tard, si vous en avez besoin pour obtenir des lignes.
Une réponse plus générique qui m'aurait fait gagner du temps, et j'espère que d'autres:
Ne fonctionne pas (renvoie comte de toutes les lignes):
DB::table('users')
->select('first_name')
->distinct()
->count();
Le correctif:
DB::table('users')
->distinct()
->count('first_name');
J'ai eu un problème similaire, et trouvé un moyen de le contourner.
Le problème est la façon dont le générateur de requêtes de Laravel gère les agrégats. Il prend le premier résultat retourné, puis renvoie la valeur 'aggregate'. C'est généralement bien, mais lorsque vous combinez count avec groupBy, vous renvoyez un count par élément groupé. Donc, l'agrégat de la première ligne est juste un compte du premier groupe (donc quelque chose de bas comme 1 ou 2 est probable).
Donc le compte de Laravel est sorti, mais j'ai combiné le Laravel query builder avec du SQL brut pour obtenir un décompte précis de mes résultats groupés.
Pour votre exemple, je m'attends à ce que ce qui suit fonctionne (et vous permette d'éviter le get):
$query = $ad->getcodes()->groupby('pid')->distinct();
$count = count(\DB::select($query->toSql(), $query->getBindings()));
Si vous voulez vous assurer que vous ne perdez pas de temps à sélectionner toutes les colonnes, vous pouvez éviter cela lors de la construction de votre requête:
$query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct();
Ça ne marcherait pas?
$ad->getcodes()->distinct()->get(['pid'])->count();
Voir ici pour la discussion..
Essayez ce qui suit:
$ad->getcodes()->groupby('pid')->distinct()->get()->count()
Je suis tombé sur le même problème.
Si vous installez laravel debug bar, vous pouvez voir les requêtes et voir souvent le problème
$ad->getcodes()->groupby('pid')->distinct()->count()
Changer pour
$ad->getcodes()->distinct()->select('pid')->count()
Vous devez définir les valeurs à renvoyer comme distinctes. Si vous ne définissez pas les champs select, toutes les colonnes de la base de données seront retournées et toutes seront uniques. Donc, définissez la requête sur distinct et sélectionnez uniquement les colonnes qui composent votre valeur 'distincte' que vous voudrez peut-être ajouter plus. {[2] } pour obtenir toutes les valeurs uniques utilisateur dans un jour
DB::table('adverts')->distinct()->select('ad_advertiser')->get()
Cela fonctionnait pour moi donc Essayez Ceci: $annonce->getcodes()->distincts ("pid")->count()