Yii2 сортировка с расчетами в ActiveDataProviderRecord - PullRequest
1 голос
/ 24 октября 2019

Я хотел бы добавить группу с расчетами в yii2 ActiveDataProvider. Так что в настоящее время у меня есть следующие поля в моей базе данных

tbl_products
   id, products, pts_log,pts_chum

Так что я хотел бы сгруппировать мои данные по формуле

pts_log * pts_chum / 100

Так что у меня есть следующее в моем контроллере

ActiveDataProvider([
        'query' => $query,
        'sort' => ['defaultOrder' => ['(pts_log * pts_chum / 100)' => SORT_DESC]],
        'pagination' => [
            'pageSize' => $this->paginator['perPage']/2,
            'page' => $this->paginator['page']
        ],
    ]);

Но теперь я получаю сообщение об ошибке

undefined (pts_log * pts_chum / 100)

Это работает с одним ключом элемента, таким как pts_log. Что добавить, чтобы сортировка работала с формулами.

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Вы должны добавить псевдоним в поле, по которому должен быть сгруппирован запрос, и использовать псевдоним в сортировке.

$query = (new \yii\db\Query())
    ->select ('count(*) as c, ((pts_log * pts_chum / 100) as calc_field')
    ->from('tbl_products')
    ->groupBy('calc_field');
$dataProvider = new \yii\data\ActiveDataProvider([
    'query' => $query,
    'sort' => ['defaultOrder' => ['calc_field' => SORT_DESC]],
]);

Используйте простые требуемые агрегаты вместо count (*) .

0 голосов
/ 24 октября 2019

В этом случае вы получаете сообщение об ошибке undefined (pts_log * pts_chum / 100) , поскольку это не имя столбца и недопустимое выражение.

Необходимо создать новую переменную в модели ActiveRecord ии заполните его данными из вычисленного выражения.

Затем это имя переменной используйте в сортировке 'sort' => ['defaultOrder' => ['expr_item' => SORT_DESC]] Посмотрите на http://webtips.krajee.com/filter-sort-summary-data-gridview-yii-2-0/ Подобный вариант рассматривается здесь.

Или подготовьте $запрос вроде:

$tn = TblProdukts::tableName();
$query = TblProdukts::find()->select([
                        TblProdukts::tableName().'.*',
                        "(".$tn.".id*".$tn.".rank/100) AS expr"
                    ]);

В классе Active Record создайте переменную $expr;

При необходимости добавьте ее в безопасные правила:

public function rules()
    {
        return [
            [[  
                'expr'// expression
            ], 
                'safe'],
        ];
    }
...