Yii2 добавить связанный атрибут для сортировки

У меня есть обычный ModelSearch с ActiveDataProvider, и я хотел бы добавить виртуальный / связанный атрибут для сортировки в gridview. Если я использую setSort и добавляю этот единственный атрибут, то все остальные атрибуты больше не сортируются. Есть ли встроенный способ добавить атрибут в сортировку? Большое спасибо!

public function search($params) {
    $query = Za::find();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => ['defaultOrder' => ['aonr' => SORT_ASC]],
        'pagination' => [
            'pageSize' => 15,
        ],
    ]);

$dataProvider->setSort([
    'attributes' => [
        'lwnr' => [
            'asc' => ['lwnr' => SORT_ASC],
            'desc' => ['lwnr' => SORT_DESC],
            'label' => 'lwnr',
            'default' => SORT_DESC,
        ],
    ]
]);

$this->load($params);
...
}

1 ответ

Решение

Вы можете установить сортируемые атрибуты с помощью метода setSort, но в этом случае вам нужно установить все столбцы, которые вы хотите отсортировать, а не только столбец из отношения.

Если вы хотите добавить один столбец, вы можете попробовать это (объединяя существующие атрибуты сортировки с новым):

    $dataProvider->setSort([
        'attributes' => array_merge(
            $dataProvider->getSort()->attributes,
            [
                'lwnr' => [
                    'asc'     => ['lwnr' => SORT_ASC],
                    'desc'    => ['lwnr' => SORT_DESC],
                    'label'   => 'lwnr',
                    'default' => SORT_DESC,
                ],
            ]
        ),
    ]);

или вы можете добавить отсутствующие атрибуты / столбцы вручную (что гораздо лучше)

    $dataProvider->setSort([
        'attributes' =>
            [
                'lwnr' => [
                    'asc'     => ['lwnr' => SORT_ASC],
                    'desc'    => ['lwnr' => SORT_DESC],
                    'label'   => 'lwnr',
                    'default' => SORT_DESC,
                ],
                // Other attribute
                'id'   => [
                    'asc'  => ['id' => SORT_ASC],
                    'desc' => ['id' => SORT_DESC],
                ],
                ...
            ],
    ]);

По-другому:

$dataProvider->getSort()->attributes['lwnr'] = [
                    'asc'     => ['lwnr' => SORT_ASC],
                    'desc'    => ['lwnr' => SORT_DESC],
                    'label'   => 'lwnr',
                    'default' => SORT_DESC,
                ];
Другие вопросы по тегам