我需要从具有相同条件的称为“医院”的表中获取一些记录:
首先获取与$ city参数匹配的城市。其次,获得与$ state参数相符的状态。第三把剩下的由AZ定购
由于要对resulset进行分页,因此我需要在一个查询中获取所有这些数据,因此我选择了CSqlDataProvider,它会接收sql,计数和分页作为初始配置:http ://www.yiiframework.com/doc /api/1.1/CSqlDataProvider
因此,我正在考虑将其他字段设置为布尔值,并按主题将它们排序,例如:same_city,same_state。
因此,我们假设这是进入CSqlDatProvider的结果sql(当我用请求中的params值替换时):
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;
如果我将此字符串分配给CSqlDataProvider,则由于我正在对顺序进行硬编码,因此我将无法进行分页…但是我需要此特定顺序,因此记录检索的条件是成功的。
$arHospitals = new CSqlDataProvider($sql, array( 'totalItemCount'=>$count, 'pagination'=>array( 'pageSize'=>30, ), ));
如果我运行上面的代码,无论pageSize大小如何,它将返回整个匹配的记录。但是,如果我根据yii文档使用分页,则只会得到分页指示的记录,但对我来说是无意义的顺序…我在字段中需要以下顺序: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, ), ));
关于如何解决这个问题的任何想法?如果我缺少有关该问题的一些关键信息,请告诉我。
这样的事情应该起作用:
$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, ), ));
有关更多信息,请参见http://www.yiiframework.com/doc/api/1.1/CSort#attributes- detail。