yii2: default order for sort can't pass table name as prefix

What steps will reproduce the problem?

So… I can add additional order

        $dataProvider->sort->attributes = array_merge($dataProvider->sort->attributes, [
            'anotherModel' => [
                'asc' => [$anotherModelTable . '.name' => SORT_ASC],
                'desc' => [$anotherModelTable . '.name' => SORT_DESC],
                'default' => SORT_ASC,
            ],
            'blockFilter' => [
                'asc' => [static::tableName() . '.[[' . 'isActive' . ']]' => SORT_ASC],
                'desc' => [static::tableName() . '.[[' . 'isActive' . ']]' => SORT_DESC],
                'default' => SORT_ASC,
            ],
        ]);

And I wish to add default order in same format

        $dataProvider->sort->defaultOrder = [static::tableName() . '.' . 'id' => SORT_DESC];

What is the expected result?

Default order is a id desc

What do you get instead?

SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘0’ in ‘order clause’ https://github.com/yiisoft/yii2/blob/6d10d1f05df9c85ea0ca127bdc6bdc900bc9c6ba/framework/data/Sort.php#L222 $attributeOrders is a

array (
  '{{%this_table}}.id' => 3,
)

for case w/o default order and with sort by blockFilter $attributeOrders is a

Array
(
    [blockFilter] => 4
)

Additional info

Q A
Yii version v2.0.19-dev
PHP version 7.3.3
Operating system

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 22 (9 by maintainers)

Most upvoted comments

My apologies, looks like somehow I’m not able to explain it easy enough. I took a liberty of checking it myself and it absolutely works. So set your data provider like that:

$provider = new ActiveDataProvider([
    // ...
    'sort' => [
        'defaultOrder' => [
            'projectName' => SORT_ASC,
            'jobName' => SORT_ASC, 
        ],
        'attributes' => [
            'projectName' => [
                'asc' => ['projects.name' => SORT_ASC],
                'desc' => ['projects.name' => SORT_DESC],
                'default' => SORT_ASC,
            ],
            'jobName' => [
                'asc' => ['jobs.name' => SORT_ASC],
                'desc' => ['jobs.name' => SORT_DESC],
                'default' => SORT_ASC,
            ],
        ],
    ],
]);

or, if you don’t want two separate things:

$provider = new ActiveDataProvider([
    // ...
    'sort' => [
        'defaultOrder' => [
            'projectAndJobName' => SORT_ASC,
        ],
        'attributes' => [
            'projectAndJobName' => [
                'asc' => ['projects.name' => SORT_ASC, 'jobs.name' => SORT_ASC],
                'desc' => ['projects.name' => SORT_DESC, 'jobs.name' => SORT_DESC],
                'default' => SORT_ASC,
            ],
        ],
    ],
]);

Of course you need to have projects and jobs tables available in the query provided for the data provider.