Estoy tratando de filtrar resultados de un CActiveDataProvider que luego muestro en un CListView … Pues sucede que yii normalmente hace 2 consultas, la primera para obtener un COUNT de resultados y la segunda es la consulta para obtener los datos… solo que al hacer el COUNT no esta respetando la condicion basica para poder realizar el filtrado… vean de lo que hablo…
Consulta 1 :: COUNT :: Lo que hace Yii
SELECT COUNT(DISTINCT t.id) FROM tabla t WHERE nombre LIKE ('%tel%')
// Genera 30 registros encontrados
Consulta 2 :: Resultados
SELECT DISTINCT(codigo) FROM tabla WHERE nombre LIKE ('%tel%')
// Genera 2 registros encontrados
Consulta 3 :: COUNT :: Lo que deberia de hacer Yii
SELECT COUNT(DISTINCT t.codigo) FROM tabla t WHERE nombre LIKE ('%tel%')
// Genera 2 registros encontrados
En realidad la consulta 1 esta mal, porque hace DISTINCT del id de la tabla (id es un campo autoincremental que nunca se repite lo que genera mas resultados de los que deberian de ser), yo lo que necesito es que haga COUNT pero del DISTINCT t.codigo que seria como una forma de agrupar los resultados…
Alguien sabe de que manera puedo yo personalizar el COUNT o decirle que el lugar de tomar el id de la tabla tome el campo codigo ??
Muchas gracias por la respuesta Horacio… inicialmente pense que utilizaria queryScalar con una consulta, pero viendo que podia usar setTotalItemCount decidi hacerlo mas facil… y quedo lo siguiente:
A- Crea una variable cantidad en la clase del modelo (en nuestro caso llamaremos al modelo Tabla)
class Tabla extends CActiveRecord {
public $cantidad;
....
B- en el controlador, tienes que modificar el criterio temporalmente para hacer el count
//aquí va el código que ya tienes
$criteria->distinct=false; //cambio a falso
$criteria->select="COUNT(DISTINCT t.codigo) as cantidad" ; //cambio
$cantidad=Tabla::model()->find($criteria)->cantidad;
$criteria->distinct=true; //restauro
$criteria->select=null;//restauro
//sigue tu codigo
$dataProvider->setTotalItemCount($cantidad);
//sigue tu codigo