介绍(Introduction) 入门(Getting Started) 应用结构(Application Structure) 请求处理(Handling Requests) 关键概念(Key Concepts) 配合数据库工作(Working with Databases) 接收用户数据(Getting Data from Users) 显示数据(Displaying Data) 安全(Security) 缓存(Caching) RESTful Web 服务(RESTful Web Services) 开发工具(Development Tools) 测试(Testing) 高级专题(Special Topics) 小部件(Widgets) 助手类(Helpers)

排序

社区推荐:掘金是一个面向程序员的技术社区,从后端到架构,从 PHP 最佳实践到一线大厂经验分享,无论入门还是进阶,来掘金你不会错过后端开发的任何一个技术干货。

展示多条数据时,通常需要对数据按照用户指定的列进行排序。 Yii 使用 yii\data\Sort 对象来代表排序方案的有关信息。 特别地,

  • attributes 指定 属性,数据按照其排序。 一个属性可以就是简单的一个 model attribute, 也可以是结合了多个 model 属性或者 DB 列的复合属性。下面将给出更多细节。
  • attributeOrders 给出每个属性当前设置的 排序方向。
  • orders 按照低级列的方式给出排序方向。

使用 yii\data\Sort,首先要声明什么属性能进行排序。 接着从 attributeOrders 或者 orders 取得当前设置的排序信息, 然后使用它们来自定义数据查询。例如,

use yii\data\Sort;

$sort = new Sort([
    'attributes' => [
        'age',
        'name' => [
            'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
            'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
            'default' => SORT_DESC,
            'label' => 'Name',
        ],
    ],
]);

$articles = Article::find()
    ->where(['status' => 1])
    ->orderBy($sort->orders)
    ->all();

上述例子中,为 Sort 对象声明了两个属性: agename

age 属性是 Article 与 Active Record 类中 age 属性对应的一个简单属性。 上述声明与下述等同:

'age' => [
    'asc' => ['age' => SORT_ASC],
    'desc' => ['age' => SORT_DESC],
    'default' => SORT_ASC,
    'label' => Inflector::camel2words('age'),
]

name 属性是由 Articlefirsr_namelast_name 定义的一个复合属性。 使用下面的数组结构来对它进行声明:

  • ascdesc 元素指定了如何按照该属性进行升序和降序的排序。 它们的值代表数据真正地应该按照什么列和方向进行排序。 你可以指定一列或多列来指出到底是简单排序还是多重排序。
  • default 元素指定了当一次请求时,属性应该按照什么方向来进行排序。 它默认为升序方向,意味着如果之前没有进行排序,并且 你请求按照该属性进行排序,那么数据将按照该属性来进行升序排序。
  • label 元素指定了调用 yii\data\Sort::link() 来创建一个排序链接时应该使用什么标签。 如果不设置,将调用 yii\helpers\Inflector::camel2words() 来通过属性名生成一个标签。 注意,它并不是 HTML编码的。

信息: 你可以将 orders 的值直接提供给数据库查询来构建其 ORDER BY 子句。 不要使用 attributeOrders, 因为一些属性可能是复合的,是不能被数据库查询识别的。

你可以调用 yii\data\Sort::link() 来生成一个超链接,用户可以通过点击它来请求按照指定的属性对数据进行排序。 你也可以调用 yii\data\Sort::createUrl() 来生成一个可排序的 URL。 例如,

// 指定被创建的 URL 应该使用的路由
// 如果你没有指定,将使用当前被请求的路由
$sort->route = 'article/index';

// 显示链接,链接分别指向以 name 和 age 进行排序
echo $sort->link('name') . ' | ' . $sort->link('age');

// 显示: /index.php?r=article%2Findex&sort=age
echo $sort->createUrl('age');

yii\data\Sort 查看 sort 查询参数来决定哪一个属性正在被请求来进行排序。 当该参数不存在时,你可以通过 yii\data\Sort::$defaultOrder 来指定默认的排序。 你也可以通过配置 sortParam 属性来自定义该查询参数的名字。

TPshop
发现错别字或您认为此页面需要改进?
点此进入 Github 编辑