Je voudrais générer la requête suivante en utilisant 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`
Dans 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!
Solution:
$leadsCount = Lead::find()
->select(['COUNT(*) AS cnt'])
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->all();
et ajoutez public $cnt
au modèle, dans mon cas, Lead.
Comme Kshitiz l'a également déclaré, vous pouvez également utiliser yii\db\Query::createCommand()
.
Vous pouvez obtenir le nombre en utilisant count () dans la requête sélectionnée.
$leadCount = Lead::find()
->where(['approved'=>'1'])
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();
Lien de référence pour diverses fonctions de requête de sélection
Si le nombre vous intéresse, utilisez yii\db\Query
comme mentionné par d'autres. Ne nécessitera aucune modification de 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 documentation de l'API Yii2
Sans ajouter la propriété $cnt
au modèle
$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();
Juste une note, au cas où cela aiderait quelqu'un, qu'un getter utilisé en tant que propriété est comptable (alors que s'il est appelé en tant que fonction, il retournera 1). Dans cet exemple, j'ai une classe Category avec des listings joints par listing_to_category. Pour obtenir des listes approuvées et actives pour la catégorie, je retourne une requête ActiveQuery, ainsi:
/**
* @return \yii\db\ActiveQuery
*/
public function getListingsApprovedActive() {
return $this->hasMany(Listing::className(), ['listing_id' => 'listing_id'])
->viaTable('listing_to_category', ['category_id' => 'category_id'])
->andWhere(['active' => 1])->andWhere(['approved' => 1]);
}
L'appel du décompte sur la propriété de la catégorie renverra le décompte d'enregistrement:
count($oCat->listingsApprovedActive)
L'appel compte sur la fonction retournera 1:
count($oCat->getListingsApprovedActive())