des1roer
@des1roer
ученье - свет, а неученье - приятный полумрак

Yii2 кастомная сортировка в апи?

нужно реализовать запрос специфичный для pg вида
SELECT * FROM "related_item" ORDER BY position = 2 DESC, position = 1 DESC, position = 3 ASC


для апи вида api/item/?sort={position:2,position:1,-position:3}

т.е както переопределить /vendor/yiisoft/yii2/data/Sort.php

кто-нибудь сталкивался с подобным?
  • Вопрос задан
  • 1018 просмотров
Решения вопроса 1
des1roer
@des1roer Автор вопроса
ученье - свет, а неученье - приятный полумрак
class Sort extends \yii\data\Sort
{
    /**
     * @inheritdoc
     */
    public function getOrders($recalculate = false): array
    {
        $orders = [];
        $request = Yii::$app->getRequest();
        $params = $request->getQueryParams();
        if (isset($params[$this->sortParam])) {
            $sortParams = explode(',', $params[$this->sortParam]);
            foreach ($sortParams as $rawField) {
                $field = explode(':', ltrim($rawField, '-'));
                $sort = 'ASC';
                if (($rawField{0} == '-')) {
                    $sort = 'DESC';
                }
                if (in_array($field[0], array_keys($this->attributes)) && !empty($field[1])) {
                    $value = (int) $field[1];
                    $orders[] = (new Expression("$field[0] = $value $sort"));
                }
            }
        }

        $orders = ArrayHelper::merge(
            $orders,
            parent::getOrders($recalculate)
        );

        return $orders;
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
А нужен ли sort? Если у Вас там dataProvider то проще наверное изменить query
'query' => SomeModel::find()->orderBy('position = 2 DESC, position = 1 DESC, position = 3 ASC')

Если все таки sort то должно работать так:
$sort = new Sort([
        'attributes' => [
            'position' => [
                'default' => 'position = 2 DESC, position = 1 DESC, position = 3 ASC',
            ],
        ],
    ]);

Но вообще начиная с версии 2.0.12 можно так:
'name' => [
    'asc' => '[[last_name]] ASC NULLS FIRST', // PostgreSQL specific feature
    'desc' => '[[last_name]] DESC NULLS LAST',
]

вот доки: www.yiiframework.com/doc-2.0/yii-data-sort.html#$a...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы