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 :(

58
demandé sur Inigo EC 2015-02-22 00:44:27

9 réponses

Ce qui suit devrait fonctionner

$ad->getcodes()->distinct('pid')->count('pid');
64
répondu Suresh Bala 2015-04-19 09:34:01

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.

9
répondu Zoon 2016-03-20 10:38:37

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');
7
répondu Andrew 2018-03-04 18:43:15

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();
3
répondu Matt McDonald 2016-12-21 09:20:01

Ça ne marcherait pas?

$ad->getcodes()->distinct()->get(['pid'])->count();

Voir ici pour la discussion..

1
répondu JonnyFoley 2017-02-13 10:50:16

Essayez ce qui suit:

$ad->getcodes()->groupby('pid')->distinct()->get()->count()
0
répondu Ragnarsson 2015-02-21 22:21:30

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

0
répondu Brett 2017-02-07 00:47:01
DB::table('adverts')->distinct()->select('ad_advertiser')->get()
0
répondu Gurpreet Singh 2017-11-26 09:18:12

Cela fonctionnait pour moi donc Essayez Ceci: $annonce->getcodes()->distincts ("pid")->count()

-1
répondu Sushant Yadav 2016-02-04 11:35:32