在yii中使用CSqlDataProvider进行排序

时间:2013-11-08 17:12:23

标签: php mysql sql yii pagination

我需要从一个名为Hospitals的表中获取一些记录,并使用相同的标准:

首先获得哪个城市与$ city param相匹配。 第二个获得与$ state param状态匹配的那些。 第三个由A-Z

订购

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

所以,我正在考虑将额外的字段作为布尔值并由theese进行排序,例如:same_city,same_state。

所以让我们假设这是结果sql(当我用来自请求的params值替换时)转到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;

如果我将此字符串分配给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,
    ),
));

如何解决这个问题?如果我遗漏了一些关于这个问题的重要信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

$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