2014-06-24 2 views
15

Je voudrais générer requête suivante en utilisant yii2:Comment compter et le groupe par dans yii2

SELECT COUNT(*) AS cnt FROM lead WHERE approved = 1 GROUP BY promoter_location_id, lead_type_id

J'ai essayé:

$leadsCount = Lead::find() 
->where('approved = 1') 
->groupBy(['promoter_location_id', 'lead_type_id']) 
->count(); 

qui génère cette requête:

SELECT COUNT(*) FROM (SELECT * FROM `lead` WHERE approved = 1 GROUP BY `promoter_location_id`, `lead_type_id`) `c` 

En yii 1.x j'aurais fait ce qui suit:

$criteria = new CDbCriteria(); 
$criteria->select = 'COUNT(*) AS cnt'; 
$criteria->group = array('promoter_location_id', 'lead_type_id'); 

Merci!

+0

vous pouvez utiliser la commande create pour écrire votre requête mysql – Kshitiz

+0

Veuillez poster la solution comme réponse. – Cthulhu

Répondre

20

Solution:

$leadsCount = Lead::find() 
->select(['COUNT(*) AS cnt']) 
->where('approved = 1') 
->groupBy(['promoter_location_id', 'lead_type_id']) 
->all(); 

et ajouter public $cnt au modèle, dans mon cas principal.

Comme Kshitiz a également déclaré, vous pouvez également utiliser yii\db\Query::createCommand().

+0

Oki, succès merci – MrBii

+0

Cela fonctionne et j'ai dû ajouter la variable publique à la classe de modèle et mentionné par @deacs et remplacer la méthode all() par '-> createCommand() -> queryAll();' Notez également que ma méthode select() a des multiples '-> select (['type, date (significant_timestamp) AS significant_timestamp, COUNT (*) AS size'])' –

5

Si vous êtes seulement intéressé par le nombre, utilisez yii\db\Query comme mentionné par d'autres. Ne nécessite pas de modifications à votre modèle:

$leadsCount = (new yii\db\Query()) 
    ->from('lead') 
    ->where('approved = 1') 
    ->groupBy(['promoter_location_id', 'lead_type_id']) 
    ->count(); 

Voici un lien vers la Yii2 API documentation

5

Vous pouvez obtenir le nombre en utilisant count() dans la requête de sélection

$leadCount = Lead::find() 
->where(['approved'=>'1']) 
->groupBy(['promoter_location_id', 'lead_type_id']) 
->count(); 

Reference Link pour diverses fonctions de la requête de sélection

0

Sans ajouter le $cnt rty to model

$leadsCount = Lead::find() 
->select(['promoter_location_id', 'lead_type_id','COUNT(*) AS cnt']) 
->where('approved = 1') 
->groupBy(['promoter_location_id', 'lead_type_id']) 
->createCommand()->queryAll(); 
+1

Veuillez ne pas simplement poster du code mais aussi ajouter quelques mots expliquant ce que le pivot la différence est. – mkl

+0

Mais nous ne recevons pas ActiveRecords à la suite –

Questions connexes