Laravel Eloquent – distinct () et count () ne fonctionnent pas correctement ensemble

J’essaie donc d’obtenir le nombre de pids distincts sur une requête, mais la valeur renvoyée est incorrecte.

C’est ce que j’essaye de faire:

$ad->getcodes()->groupby('pid')->distinct()->count() 

ce qui renvoie la valeur “2”, alors que la valeur à renvoyer, devrait être “1”.

Pour contourner ce problème, je le fais:

 count($ad->getcodes()->groupby('pid')->distinct()->get()) 

ce qui fonctionne bien et renvoie “1”

Existe-t-il une règle où le nombre et la distinction ne peuvent pas figurer sur la même requête? Je trouve le type de solution de rechange “lourd”, je voudrais faire le travail de requête d’origine 🙁

Ce qui suit devrait fonctionner

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

Quelqu’un d’autre a-t-il trouvé cet article sans trouver les autres suggestions pour travailler?

Selon la requête spécifique, une approche différente peut être nécessaire. Dans mon cas, je devais soit compter les résultats d’un GROUP BY , par exemple

 SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b) 

ou utilisez COUNT(DISTINCT b) :

 SELECT COUNT(DISTINCT b) FROM a 

Après quelques interrogations, je me suis rendu compte qu’il n’y avait pas de fonction Laravel intégrée à cet égard. La solution la plus simple consistait donc à utiliser DB::raw avec la méthode count .

 $count = $builder->count(DB::raw('DISTINCT b')); 

N’oubliez pas de ne pas utiliser groupBy avant d’appeler count . Vous pouvez appliquer groupBy ultérieurement, si vous en avez besoin pour obtenir des lignes.

Une réponse plus générique qui m’aurait permis de gagner du temps et, espérons-le, d’autres:

Ne fonctionne pas (renvoie le nombre 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 j’ai trouvé un moyen de contourner le problème.

Le problème réside dans la manière dont le générateur de requêtes de Laravel gère les agrégats. Il prend le premier résultat renvoyé et retourne la valeur «d’agrégat». C’est généralement bien, mais lorsque vous combinez le compte avec groupBy, vous retournez un nombre par élément groupé. Ainsi, l’agrégat de la première ligne n’est qu’un décompte du premier groupe (il est donc probable que quelque chose de faible comme 1 ou 2 soit utilisé).

Donc, le décompte de Laravel est sorti, mais j’ai combiné le générateur de requêtes Laravel avec un SQL brut pour obtenir un compte précis de mes résultats groupés.

Pour votre exemple, je m’attends à ce que les éléments suivants fonctionnent (et vous permettent d’éviter les 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 création de votre requête:

  $query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct(); 

Cela ne fonctionnerait-il 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 la barre de débogage laravel, vous pouvez voir les requêtes et voir souvent le problème

 $ad->getcodes()->groupby('pid')->distinct()->count() 

changer à

 $ad->getcodes()->distinct()->select('pid')->count() 

Vous devez définir les valeurs à renvoyer comme distinctes. Si vous ne définissez pas les champs de sélection, toutes les colonnes de la firebase database seront renvoyées et toutes seront uniques. Par conséquent, définissez la requête sur distincte et sélectionnez uniquement les colonnes qui constituent votre valeur «distincte» que vous pourriez vouloir append. ->select('pid','date') pour obtenir toutes les valeurs uniques d’un utilisateur par jour

 DB::table('adverts')->distinct()->select('ad_advertiser')->get() 

Cela fonctionnait pour moi alors essayez ceci: $ ad-> getcodes () -> distinct (‘pid’) -> count ()