Yii2 添加相关属性进行排序

use*_*599 4 sorting gridview virtual-attribute yii2

我有带有 ActiveDataProvider 的普通 ModelSearch,我想在 gridview 中添加一个虚拟/相关属性来排序。如果我正在使用 setSort,并且我只添加了这个属性,那么所有其他属性都不再可排序。是否有内置的方法可以向 Sort添加属性?非常感谢!

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);
...
}
Run Code Online (Sandbox Code Playgroud)

Szá*_*tán 5

您可以使用 setSort 方法设置可排序属性,但在这种情况下,您需要设置要排序的所有列,而不仅仅是关系中的列。

如果您想添加一列,您可以尝试此操作(将当前现有的排序属性与新的排序属性合并):

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

或者您可以手动添加缺少的属性/列(这是一个更好的主意)

    $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],
                ],
                ...
            ],
    ]);
Run Code Online (Sandbox Code Playgroud)

其它的办法:

$dataProvider->getSort()->attributes['lwnr'] = [
                    'asc'     => ['lwnr' => SORT_ASC],
                    'desc'    => ['lwnr' => SORT_DESC],
                    'label'   => 'lwnr',
                    'default' => SORT_DESC,
                ];
Run Code Online (Sandbox Code Playgroud)