1 follower

Сортировка

При выводе нескольких строк данных часто требуется сортировка по определённым столбцам, указанным пользователем. Yii использует объект yii\data\Sort для представления информации о схеме сортировки. В частности,

  • attributes определяет атрибуты, по которым данные могут быть отсортированы. Атрибут может соответствовать простому атрибуту модели или быть составным, объединяющим несколько атрибутов модели или столбцов БД. Подробности приведены ниже.
  • 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 объявлены два атрибута: age и name.

Атрибут age - это простой атрибут, соответствующий атрибуту age класса Active Record Article. Он эквивалентен следующему объявлению:

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

Атрибут name - это составной атрибут, определённый через first_name и last_name модели Article. Он объявлен с помощью следующей структуры массива:

  • Элементы asc и desc задают порядок сортировки по атрибуту по возрастанию и убыванию соответственно. Их значения представляют реальные столбцы и направления сортировки. Можно указать один или несколько столбцов для простой или составной сортировки.
  • Элемент default задаёт направление сортировки при первом запросе. По умолчанию - по возрастанию: если атрибут ранее не сортировался и пользователь запросил сортировку по нему, данные будут отсортированы по возрастанию.
  • Элемент label задаёт метку, используемую при вызове yii\data\Sort::link() для создания ссылки сортировки. Если не указан, для генерации метки из имени атрибута будет вызван yii\helpers\Inflector::camel2words(). Метка не кодируется в HTML.

Информация: Значение orders можно передавать напрямую в запрос к базе данных для построения секции ORDER BY. Не используйте для этого attributeOrders, так как некоторые атрибуты могут быть составными и не будут распознаны запросом к БД.

Для создания гиперссылки, по которой пользователь может запросить сортировку по указанному атрибуту, вызовите yii\data\Sort::link(). Для создания URL сортировки используйте yii\data\Sort::createUrl(). Например:

// задаёт маршрут, который будет использоваться в 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 проверяет query-параметр sort, чтобы определить, по каким атрибутам запрошена сортировка. Сортировку по умолчанию (при отсутствии параметра) можно задать через yii\data\Sort::$defaultOrder. Имя query-параметра настраивается через свойство sortParam.

Found a typo, or you think this page needs improvement?
Edit it on GitHub !