Php Yii2按计算的相关字段排序

Php Yii2按计算的相关字段排序,php,gridview,yii2,Php,Gridview,Yii2,在过去的几个小时里,我试图创建一个gridview可排序的计算列,但没有成功,我尝试了那里的每一个指南,按照完全相同的步骤,没有得到任何软件 计算出的关系: public function getOrderAmount() { return $this->hasMany(Transaction::className(), ['user_id' => 'id'])->sum('sum'); } class UserSearch extends User { pu

在过去的几个小时里,我试图创建一个gridview可排序的计算列,但没有成功,我尝试了那里的每一个指南,按照完全相同的步骤,没有得到任何软件

计算出的关系:

public function getOrderAmount() {
    return $this->hasMany(Transaction::className(), ['user_id' => 'id'])->sum('sum');
}
class UserSearch extends User
{
    public $orderAmount;

    public function rules()
    {
        return [
            [['id'], 'integer'],
            [['orderAmount'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        return Model::scenarios();
    }

    public function search($params)
    {
        $query = User::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);


        $dataProvider->setSort([
            'attributes'=>[
                'id',
                'name',
                'orderAmount'=>[
                    'asc'=>['orderSum.order_amount'=>SORT_ASC],
                    'desc'=>['orderSum.order_amount'=>SORT_DESC],
                    'label'=>'Order Name'
                ]
            ]
        ]);

        $this->load($params);

        if (!$this->validate()) {
            return $dataProvider;
        }

        $query->andFilterWhere(['orderSum.order_amount'=>$this->orderAmount]);

        return $dataProvider;
    }
}
用户搜索模型:

public function getOrderAmount() {
    return $this->hasMany(Transaction::className(), ['user_id' => 'id'])->sum('sum');
}
class UserSearch extends User
{
    public $orderAmount;

    public function rules()
    {
        return [
            [['id'], 'integer'],
            [['orderAmount'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        return Model::scenarios();
    }

    public function search($params)
    {
        $query = User::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);


        $dataProvider->setSort([
            'attributes'=>[
                'id',
                'name',
                'orderAmount'=>[
                    'asc'=>['orderSum.order_amount'=>SORT_ASC],
                    'desc'=>['orderSum.order_amount'=>SORT_DESC],
                    'label'=>'Order Name'
                ]
            ]
        ]);

        $this->load($params);

        if (!$this->validate()) {
            return $dataProvider;
        }

        $query->andFilterWhere(['orderSum.order_amount'=>$this->orderAmount]);

        return $dataProvider;
    }
}
观点:

<?= GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $searchModel,
            'responsive' => true,
            'hover' => true,
            'perfectScrollbar' => true,
            'columns' => [
                        'orderAmount',
            ],
        ]); ?>
注意:为了便于调试,我删除了其他代码块

 1054 Unknown column 'orderSum.order_amount' in 'order clause'
错误基本上是说它找不到列,因为即使您在模型上声明了关系,但还并没有使用它

在用户搜索模型中,在加载参数之前,应该使用关系

    $query->joinWith('orderAmount as oa');
    $this->load($params);
另外,不要忘记在UserSearch模型上添加array_merge方法,因为您正在使用另一个属性

 public function attributes()
   {
     // add related fields to searchable attributes
     return array_merge(parent::attributes(), ['oa.order_amount ']);
   }
最后,由于我们将关系名称重写为“oa”,您应该将“orderAmount”更改为“oa”