简体   繁体   English

Yii2按计算的相关字段排序

[英]Yii2 sort by calculated related fields

Over the last couple of hours, I'm trying to create a gridview sortable calculated column without success, I tried every guide out there, followed the exact same steps and got no ware. 在过去的几个小时中,我试图创建一个没有成功的gridview可排序计算列,我尝试了所有指南,遵循了完全相同的步骤,但是没有任何软件。

The calculated relation: 计算的关系:

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

The UserSearch Model: UserSearch模型:

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;
    }
}

The view: 风景:

<?= GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $searchModel,
            'responsive' => true,
            'hover' => true,
            'perfectScrollbar' => true,
            'columns' => [
                        'orderAmount',
            ],
        ]); ?>

This is the guide I followed in the example above http://webtips.krajee.com/filter-sort-summary-data-gridview-yii-2-0/ 这是我在上面的示例中遵循的指南http://webtips.krajee.com/filter-sort-summary-data-gridview-yii-2-0/

I've got an error: 我有一个错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'orderSum.order_amount' in 'order clause'
The SQL being executed was: SELECT * FROM `tbl_users` WHERE `id` IN ('1', '56') ORDER BY `orderSum`.`order_amount` LIMIT 20

Note: I removed other code blocks for easier debugging. 注意:为了方便调试,我删除了其他代码块。

 1054 Unknown column 'orderSum.order_amount' in 'order clause'

Error basically says it can't find column because even though you declared relation on model, you didn't use it yet. 错误基本上说它找不到列,因为即使您在模型上声明了关联,您仍未使用它。

In your UserSearch model you should use relation, before loading your parameters. 在UserSearch模型中,应在加载参数之前使用Relation。

    $query->joinWith('orderAmount as oa');
    $this->load($params);

Also don't forget to add array_merge method on top your UserSearch model because you are using another attribute. 另外,不要忘记在UserSearch模型的顶部添加array_merge方法,因为您正在使用另一个属性。

 public function attributes()
   {
     // add related fields to searchable attributes
     return array_merge(parent::attributes(), ['oa.order_amount ']);
   }

and lastly, since we rewrite relation name as "oa" you should change "orderAmount" to "oa" 最后,由于我们将关系名称重写为“ oa”,因此应将“ orderAmount”更改为“ oa”

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM