首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用CSqlDataProvider对yii进行排序

利用CSqlDataProvider对yii进行排序
EN

Stack Overflow用户
提问于 2013-11-08 17:12:22
回答 1查看 1.9K关注 0票数 3

我需要从一张名为“医院”的表格中获得一些同样标准的记录:

首先得到哪个城市与$city param匹配。第二,得到与$state参数匹配的状态。第三,得到A-Z公司订购的其余部分

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

因此,我正在考虑把额外的字段作为布尔值,并按照它们进行排序,比如: same_city,same_state。

因此,让我们假设这是传递到CSqlDatProvider的结果sql (当我用请求中的params值替换时):

代码语言:javascript
复制
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,我将无法分页,因为我是硬编码顺序.然而,我需要这个特定的顺序,所以记录检索的标准是成功的。

代码语言:javascript
复制
$arHospitals = new CSqlDataProvider($sql, array(
    'totalItemCount'=>$count,
    'pagination'=>array(
        'pageSize'=>30,
    ),
));

如果我运行上面的代码,它将返回所有匹配的记录,而不管是pageSize。但是,如果我根据依伊文档使用分页,我只会得到分页所指示的记录,但对我来说没有意义的顺序。我需要字段中的以下命令: same_city DESC、same_state DESC、hospital_name ASC。

代码语言:javascript
复制
$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,
    ),
));

有什么办法解决这个问题吗?如果我漏掉了一些关于这个问题的关键信息,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-10 13:17:34

像这样的事情应该有效:

代码语言:javascript
复制
$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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19864784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档