在 GridView Yii2 中对数据进行排序和过滤,其中列不在数据库中

Sort and filter data in GridView Yii2 where column is not in database(在 GridView Yii2 中对数据进行排序和过滤,其中列不在数据库中)
本文介绍了在 GridView Yii2 中对数据进行排序和过滤,其中列不在数据库中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

如果我在 db 中有 2 个字段 - 概率和影响,并且我需要 GridView 中的一列,其中这两个字段相乘.我设法将它添加到那里:

If I have 2 fields in db - probability and influence and I need a column in GridView where these two fields are multiplied. I managed to add it there like:

    [
            'attribute' => 'priority',
            'format' => 'raw',
            'value' => function ($model) {
                return $model->influence * $model->probability;
            },
        ],

但无法处理排序,因为该列不在数据库中,向 $query 添加过滤器只会导致错误.

But can't handle the sorting, because that column is not in db and adding filters to $query causes only errors.

    $query = Risks::find();
    $query->select(`probability*influence AS priority`);
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

已更新(适用于 Asc 和 Desc 但不适用于过滤器)

Updated (works Asc and Desc but not with filters)

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

    $query->joinWith(['author', 'proj']);

    $query->select('*, (probability * influence) as priority');

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

    $dataProvider->setSort([
        'attributes' => [
           // 'id',
            'probability',
            'risks',
            'influence',
            'del' => [
                'asc' => ['risks.del' => SORT_ASC],
                'desc' => ['risks.del' => SORT_DESC],
            ],
            'priority' => [
                'asc' => ['priority' => SORT_ASC],
                'desc' => ['priority' => SORT_DESC],
                'label' => 'Priority',
            ],
            'proj' => [
                'asc' => ['projects.name' => SORT_ASC],
                'desc' => ['projects.name' => SORT_DESC],
            ],
            'author' => [
                'asc' => ['users.name' => SORT_ASC],
                'desc' => ['users.name' => SORT_DESC],
            ]
        ]
    ]);

    $this->load($params);

    if (!$this->validate()) {
        // uncomment the following line if you do not want to any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }


    $query->andFilterWhere([
        'id' => $this->id,
        'proj_id' => $this->proj_id,
        'author_id' => $this->author_id,
        'influence' => $this->influence,
        'probability' => $this->probability,
        //'del' => $this->del,
    ])
        ->andFilterWhere(['like', 'projects.name', $this->proj])
        ->andFilterWhere(['like', 'users.name', $this->author]);

    $query->andFilterWhere(['like', 'risks', $this->risks]);

    $query->having('priority = '. $this->priority);
    //$query->having(['priority' => $this->priority]);

    return $dataProvider;
}

推荐答案

第 1 步:将 getter 函数添加到您的基本 Risks 模型:

STEP 1: Add a getter function to your base Risks model:

public function getPriority() {
    return ($this->probability * $this->influence);
}

第 2 步:将属性 priority 添加到您的模型 RisksSearch 并配置您的规则.

STEP 2: Add an attribute priority to your model RisksSearch and configure your rules.

/* your calculated attribute */
public $priority;

/* setup rules */
public function rules() {
   return [
       /* your other rules */
       [['priority'], 'safe']
   ];
}

第 3 步:编辑 search() 方法以包含计算字段 priority

public function search($params) {

    $query = Person::find();

    $query->select('*, (probability * influence) as priority');

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

    /**
     * Setup your sorting attributes
     * Note: This is setup before $this->load($params)
     */
    $dataProvider->setSort([
        'attributes' => [
            'id',
            'priority' => [
                'asc' => ['priority' => SORT_ASC],
                'desc' => ['priority' => SORT_DESC],
                'label' => 'Priority',
                'default' => SORT_ASC
            ],
        ]
    ]);
    ...

第 4 步:在 $this->load($params) 之后添加 $query->andFilterWhere() 以便能够过滤计算出的字段

STEP 4: Add $query->andFilterWhere() after $this->load($params) to be able to filter the calculated field

// use the operator you wish, i.e. '=', '>', '<' etc
$query->andFilterWhere(['=', '(probability * influence)', $this->priority]);

这篇关于在 GridView Yii2 中对数据进行排序和过滤,其中列不在数据库中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以
PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的
mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)
Laravel Gmail Configuration Error(Laravel Gmail 配置错误)
Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)
Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)