yii2 множественная сортировка с использованием регистра порядка для порядка по умолчанию в ActiveDataProvider

Я создаю веб-сайт с помощью Yii2, и я хотел бы отсортировать его по нескольким полям следующим образом:

SELECT * FROM tbl_product t
ORDER BY
CASE
    WHEN t.product_sale_price IS NULL THEN t.product_price
    ELSE t.product_sale_price
END

с запросом выше, этот набор данных:

Product | product_price | product_sale_price
--------|---------------|-------------------
Prod A  | 2000          | 1200
Prod B  | 1500          | NULL
Prod C  | 1800          | NULL
Prod D  | 1000          | 500

станет:

Product | product_price | product_sale_price
--------|---------------|-------------------
Prod D  | 1000          | 500
Prod A  | 2000          | 1200
Prod B  | 1500          | NULL
Prod C  | 1800          | NULL

Как мы можем поместить его в defaultOrder ActiveDataProvider? Я попытался:

return new ActiveDataProvider([
    'sort' => [
        'defaultOrder' => ['product_sale_price' => SORT_ASC, 'product_price' => SORT_ASC],
        'enableMultiSort' => true,
    ],
]);

return new ActiveDataProvider([
    'sort' => [
        'defaultOrder' => '(CASE WHEN product_sale_price IS NULL THEN product_price ELSE product_sale_price END ASC)',
    ],
]);

Оба не работали. Как мне это сделать?


person Henry Gunawan    schedule 04.01.2017    source источник


Ответы (1)


Используйте, например: https://gist.github.com/XAKEPEHOK/9dfd72d1beb55ddacdcbac6bb61599df

потом

$expression= new Expression('(CASE WHEN product_sale_price IS NULL THEN product_price ELSE product_sale_price END ASC)');

return new ActiveDataProvider([
    'sort' => [
        'class'=><here define your sort extend class>
        'defaultOrder' => $expression,
    ],
]);

Or:

$dataProvider = new ActiveDataProvider([
            'query' => $query,            
            'sort'  => [
                'attributes' => [
                    '<attribute that you want sort>' => [
                        'asc' => [new Expression('(CASE WHEN product_sale_price IS NULL THEN product_price ELSE product_sale_price END ASC)')],
                        'desc' => [new Expression('(CASE WHEN product_sale_price IS NULL THEN product_price ELSE product_sale_price END ASC)')],
                   ],
                    // more attribute definitions here
                ],
                'defaultOrder' => ['<attribute that you want sort>' => SORT_DESC],
        ]);
person zakrzu    schedule 04.01.2017
comment
Почему? В чем проблема? - person zakrzu; 05.01.2017
comment
Я использую указанный выше метод, и он заказывает только по product_sale_price. - person Henry Gunawan; 05.01.2017
comment
первый или второй пример? если второе, покажите свой код, пожалуйста. - person zakrzu; 05.01.2017