web-dev-qa-db-fra.com

Comment compter et grouper par en yii2

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!

17
deacs

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().

22
deacs

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

8
Kailas

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

7
Harman Dhillon

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();
0
t6nnp6nn

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())
0
Rich Harding