Yii2 gridview filter 虚拟属性 textfield 默认显示数字

Yii2 gridview filter virtual attribute textfield showing a number by default

型号:

public $FnGdiff;

public function getFnGdiff() {
    return $this->FnG - $this->fd;
}

模型搜索:

public function rules() {
    return [
        [['fnGdiff'], 'safe'],
    ];
}

现在,如果我将 fnGdiff 添加到 gridview,默认情况下总是有 一个数字 (?!) 在我们可以进行过滤的文本字段中。它是零、-6 等。它是一个特性,还是一个错误,还是我忘记了要调整的东西?非常感谢!

解决方案:

型号:

public function getFnGdiff() {
    return $this->FnG - $this->fd;
}

模型搜索:

public $fnGdiff;

public function rules() {
    return [
        [['fnGdiff'], 'safe'],
    ];
}
...

(所以这个奇怪的数字就消失了,但是不可能通过这种方式过滤计算出的虚拟属性,你必须从数据库中select这样的字段才能这样做)

如果你添加 fnGdiff t 你的 gridView .. 你调用函数 getFnGdiff() .. 默认情况下似乎 return 0 ..

 could be You want show  $FnGdiff

注意函数和变量的命名约定

    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        .....
        'FnGdiff',   // $FnGdiff content
        'fnGdiff',  // function getFnGdiff() result 

并且您应该将变量和函数的代码移动到 searchModel

模型搜索

 public $FnGdiff;

 public function getFnGdiff() {
   return $this->FnG - $this->fd;
}

并从模型中删除此代码..

过滤器字段是为搜索模型呈现的,它们的属性传递给 GridView。当您创建该模型时,虚拟属性 $FnGdiff 在发送查询之前模型初始时由指定值设置。您的属性 $FnGdiff 默认设置为 0 ($this->FnG - $this->fd,在新模型中它是:null - null = 0),并且该值在文本过滤器字段中呈现。所以你应该 return 只为没有新记录指定值。试试这个:

public function getFnGdiff() {
    return $this->isNewRecord ? '' : $this->FnG - $this->fd;
}