Ich möchte mit yii2 folgende Abfrage erzeugen:
SELECT COUNT(*) AS cnt FROM lead WHERE approved = 1 GROUP BY promoter_location_id, lead_type_id
Ich habe versucht:
$leadsCount = Lead::find()
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();
Welche generiert diese Abfrage:
SELECT COUNT(*) FROM (SELECT * FROM `lead` WHERE approved = 1 GROUP BY `promoter_location_id`, `lead_type_id`) `c`
In yii 1.x hätte ich folgendes gemacht:
$criteria = new CDbCriteria();
$criteria->select = 'COUNT(*) AS cnt';
$criteria->group = array('promoter_location_id', 'lead_type_id');
Vielen Dank!
Lösung:
$leadsCount = Lead::find()
->select(['COUNT(*) AS cnt'])
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->all();
und füge public $cnt
zum Modell hinzu, in meinem Fall Lead.
Wie Kshitiz auch sagte, könnten Sie auch yii\db\Query::createCommand()
verwenden.
Sie können die Anzahl ermitteln, indem Sie count () in der Auswahlabfrage verwenden
$leadCount = Lead::find()
->where(['approved'=>'1'])
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();
Referenzlink für verschiedene Funktionen der Auswahlabfrage
Wenn Sie nur an der Zählung interessiert sind, verwenden Sie yii\db\Query
, wie von anderen erwähnt. Erfordert keine Änderungen an Ihrem Modell:
$leadsCount = (new yii\db\Query())
->from('lead')
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();
Hier ist ein Link zur Yii2 API-Dokumentation
Ohne die $cnt
-Eigenschaft zu model hinzuzufügen
$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();
Nur ein Hinweis, falls es jemandem hilft, dass ein als Eigenschaft verwendeter Getter abzählbar ist (wenn er als Funktion aufgerufen wird, wird er 1 zurückgegeben). In diesem Beispiel habe ich eine Category-Klasse mit Listings, die mit Listing_to_category verbunden sind. Um aktive, genehmigte Einträge für die Kategorie zu erhalten, gebe ich eine ActiveQuery zurück.
/**
* @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]);
}
Beim Aufruf von count für die Eigenschaft der Kategorie wird die Datensatzanzahl zurückgegeben:
count($oCat->listingsApprovedActive)
Beim Aufruf von count für die Funktion wird 1 zurückgegeben:
count($oCat->getListingsApprovedActive())