Yii2使用ActiveDataProviderRecord中的计算进行排序

Yii2使用ActiveDataProviderRecord中的计算进行排序,yii2,yii2-model,yii2-active-records,Yii2,Yii2 Model,Yii2 Active Records,我想在yii2 ActiveDataProvider中添加一个带有cacluations的groupby。 因此,目前我的数据库中有以下字段 tbl_products id, products, pts_log,pts_chum 所以我想用公式把我的数据分组 pts_log * pts_chum / 100 因此,我的控制器中有以下内容 ActiveDataProvider([ 'query' => $query, 'sort' => ['d

我想在yii2 ActiveDataProvider中添加一个带有cacluations的groupby。 因此,目前我的数据库中有以下字段

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\u log
。我需要添加什么才能使用公式进行排序。

在这种情况下,您会得到一个错误未定义(pts_log*pts_chum/100),因为它不是列名,也不是有效的表达式

您需要在ActiveRecord模型中创建新变量,并用计算表达式中的数据填充它

然后在sort
'sort'=>['defaultOrder'=>['expr\u item'=>sort\u DESC]]中使用此变量名。
这里考虑了类似的选择

或准备$query,如:

$tn = TblProdukts::tableName();
$query = TblProdukts::find()->select([
                        TblProdukts::tableName().'.*',
                        "(".$tn.".id*".$tn.".rank/100) AS expr"
                    ]);
在活动记录类中创建变量
$expr

如果需要,将其添加到安全规则中:

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

您必须向查询分组依据的字段添加别名,并在排序中使用别名

$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]],
]);
使用所需的简单聚合而不是计数(*)