php - example - yii2 filter dataprovider
Ordenando con CSqlDataProvider en yii (1)
Algo como esto debería funcionar:
$arHospitals = new CSqlDataProvider($sql, array(
''totalItemCount''=>$count,
''sort''=>array(
''attributes''=>array(
''virtualFieldName''=>array( //virtual field name
//give no possibility to sort in any other order than
''asc''=>''same_city DESC, same_state DESC, hospital_name ASC'',
''desc''=>''same_city DESC, same_state DESC, hospital_name ASC'',
''label''=>''Default Sort Order''
),
),
''defaultOrder''=>array(
''virtualFieldName''=>CSort::SORT_ASC, //default sort value
),
),
''pagination''=>array(
''pageSize''=>30,
),
));
Consulte http://www.yiiframework.com/doc/api/1.1/CSort#attributes-detail para obtener más información.
Necesito obtener algunos registros de una tabla llamada Hospitales con los mismos criterios:
Primero obtenga los que coinciden con city city con $ city param. En segundo lugar, obtenga los que coincidan con state con $ state param. En tercer lugar, obtenga el resto ordenado por AZ
Necesito obtenerlos todos en una consulta, ya que voy a paginar los resultados, así que elijo CSqlDataProvider, que recibe un sql, el recuento y la paginación como configuración inicial: http://www.yiiframework.com/doc /api/1.1/CSqlDataProvider
entonces, estaba pensando en crear campos adicionales como booleanos y ordenarlos por theese, como: same_city, same_state.
así que supongamos que este es el sql resultante (cuando reemplacé con los valores de los parámetros de la solicitud) que va al CSqlDatProvider:
select *,
IF(city like ''%San Antonio%'', 1, 0) as same_city,
IF(state=44, 1, 0) as same_state
from hospitals
order by same_city DESC, same_state DESC, hospital_name ASC;
Si asigno esta cadena al CSqlDataProvider, no podré paginar ya que estoy codificando el orden ... sin embargo, necesito este orden específico para que el criterio de recuperación de registros sea exitoso.
$arHospitals = new CSqlDataProvider($sql, array(
''totalItemCount''=>$count,
''pagination''=>array(
''pageSize''=>30,
),
));
si ejecuto el código anterior, devolverá todos los registros coincidentes, sin importar pageSize. Sin embargo, si utilizo la paginación de acuerdo con la documentación yii, obtendré solo los registros que indica la paginación, pero con un orden sin sentido para mí ... Necesito el siguiente orden en los campos: same_city DESC, same_state DESC, hospital_name ASC .
$arHospitals = new CSqlDataProvider($sql, array(
''totalItemCount''=>$count,
''sort''=>array(
''attributes''=>array(
''asc''=>array(''hospital_name''),
''desc''=>array(''same_city'', ''same_state''),
),
),
''pagination''=>array(
''pageSize''=>30,
),
));
¿Alguna idea de cómo resolver esto? Si me falta información clave sobre el problema, por favor avíseme.