deacs
Me gustaría generar la siguiente consulta usando yii2:
SELECT COUNT(*) AS cnt FROM lead WHERE approved = 1 GROUP BY promoter_location_id, lead_type_id
Yo he tratado:
$leadsCount = Lead::find()
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();
Lo que genera esta consulta:
SELECT COUNT(*) FROM (SELECT * FROM `lead` WHERE approved = 1 GROUP BY `promoter_location_id`, `lead_type_id`) `c`
En yii 1.x hubiera hecho lo siguiente:
$criteria = new CDbCriteria();
$criteria->select="COUNT(*) AS cnt";
$criteria->group = array('promoter_location_id', 'lead_type_id');
¡Gracias!
deacs
Solución:
$leadsCount = Lead::find()
->select(['COUNT(*) AS cnt'])
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->all();
y añadir public $cnt
al modelo, en mi caso Lead.
Como también dijo Kshitiz, también podría usar yii\db\Query::createCommand()
.
-
Esto funciona y tuve que agregar la variable pública a la clase modelo y mencionada por @deacs y reemplazar el método all() con
->createCommand()->queryAll();
También tenga en cuenta que mi método select () tiene múltiplos->select(['type, date(significant_timestamp) AS significant_timestamp, COUNT(*) AS size'])
-Gajen Sunthara
5 sep 2017 a las 19:18
Puede obtener el conteo usando contar() en la consulta seleccionada
$leadCount = Lead::find()
->where(['approved'=>'1'])
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();
Link de referencia para varias funciones de consulta de selección
Si solo está interesado en el conteo, use yii\db\Query
como lo mencionan otros. No requerirá ningún cambio en su modelo:
$leadsCount = (new yii\db\Query())
->from('lead')
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();
Aquí hay un enlace a la Documentación de la API de Yii2
t6nnp6nn
Sin agregar el $cnt
propiedad a modelar
$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();
Solo una nota, en caso de que ayude a alguien, que un getter utilizado como propiedad es contable (mientras que si se llama como una función, devolverá 1). En este ejemplo, tengo una clase Categoría con Listados unidos por listado_a_categoría. Para obtener listados activos y aprobados para la categoría, devuelvo un ActiveQuery, por lo tanto:
/**
* @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]);
}
Llamar a contar en la propiedad de la Categoría devolverá el recuento de registros:
count($oCat->listingsApprovedActive)
Llamar a contar en la función devolverá 1:
count($oCat->getListingsApprovedActive())
puede usar el comando crear para escribir su consulta mysql
– Kshitiz
25 de junio de 2014 a las 8:55
Por favor, publique la solución como respuesta.
– Cthulhu
26 de junio de 2014 a las 13:43