在 yii 中使用 CSqlDataProvider 进行排序


Sorting with CSqlDataProvider in yii

我需要从名为"医院"的表中获取一些具有相同标准的记录:

首先获取与$city参数匹配的城市。其次获取与参数匹配的状态$state。第三获得A-Z订购的其余部分

我需要在一个查询中获取所有这些,因为我要对 resulset 进行分页,所以我选择 CSqlDataProvider,它接收 sql、计数和分页作为初始配置:http://www.yiiframework.com/doc/api/1.1/CSqlDataProvider

所以,我想把额外的字段做成布尔值,并按你的分类,比如:same_city、same_state。

因此,让我们假设这是传递给CSqlDatProvider的结果SQL(当我替换为请求中的参数值时):

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,
    ),
));

如果我运行上面的代码,它将返回整个匹配记录,无论页面大小如何。但是,如果我根据 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。