如何从Yii2 Gridview值调用模型函数



我试图在GridView列值中显示模型数据,但它一直显示错误:在字符串上调用成员函数getUSD((
我只想在该数据单元格中显示一个数据。有人知道出了什么问题吗?

型号代码:

public static function getUSD(){
    $getUSD = Rate::find()
            ->select('rate')
            ->where(['currency_name' => 'USD'])
            ->orderBy('rate_id DESC')
            ->one();
        return $getUSD;
}

GirdView中的代码:

<?= GridView::widget([
'dataProvider' => $dataProvider,
'summary' => '',
'columns' => [
    [
        'label' => 'USD',
        'value' => function($model){
            return $model->getUSD();
        }
    ],

预期输出:

|USD|  
| 4.102|

您从函数返回的是对象,而不是实际的rate列值,您应该得到错误

htmlspecialchar((期望参数1是字符串,对象给定

而不是您提到的那个,因为gridview列希望您返回字符串,并且当尝试使用调用yiii18nFormatteryiigridDataColumn::renderDataCellContent来渲染单元格时,它会在您的情况下查找对象。

此外,你已经将函数定义为getter,yii说

Yii框架中几乎每个核心类都从CCD_ 4或子类。这意味着,无论何时在核心类中看到getter或setter,可以像所有物

并将您的功能更改为

public static function getUSD()
{
    $rate = Rate::find()
        ->select('rate')
        ->where(['currency_name' => 'USD'])
        ->orderBy('rate_id DESC')
        ->one();
    return null !== $rate ? $rate->rate : 'NA';
}

下面这样称呼它。

echo GridView::widget(
    [
        'dataProvider' => $dataProvider,
        'summary' => '',
        'columns' => [
            [
                'label' => 'USD',
                'value' => function ($model) {
                    return $model->USD;
                },
            ],
        ],
    ]
);

如果你不想更改getUSD()函数,那么你可能必须在网格视图中检查它,就像下面的一样

echo GridView::widget(
    [
        'dataProvider' => $dataProvider,
        'summary' => '',
        'columns' => [
            [
                'label' => 'USD',
                'value' => function ($model) {
                    return null !== $model->USD ? $model->USD->rate: 'NA';
                },
            ],
        ],
    ]
);

问题是getUSD()函数不返回字符串,而是返回属性为rate的对象。

为了让它像你做的那样工作,你必须直接返回对象的值,比如:

public static function getUSD(){
    $getUSD = Rate::find()
            ->select('rate')
            ->where(['currency_name' => 'USD'])
            ->orderBy('rate_id DESC')
            ->one();
        return $getUSD ? $getUSD->rate : null;
}

现在首先检查查询是否找到了什么,如果它找到了什么则返回属性rate

那么getUSD是一个静态方法,所以你不应该像$model->getUsd(),而应该像$model::getUSD()

如果您在同一时间一遍又一遍地处理相同的数据,那么我会考虑不静态地调用它们,并将结果保存在某个地方(例如,在类的属性中(,这样就不会有太多查询。

就像你的问题的答案你可以这样称呼它:

return $model::getUSD()->rate; //Call to a static method from current model

return 'USD ' . $model::getUSD()->rate; //Call to a static method from current model

就像开头描述的选项一样,您也可以这样做:

$model = new MyModel();
$rate = MyModel::getUSD()->rate;//get value of current rate
//Gridview
<?= GridView::widget([
'dataProvider' => $dataProvider,
'summary' => '',
'columns' => [
    [
        'label' => 'USD',
        'value' => function($model) use ($rate){
            return 'USD' . $rate; //Your initially stored rate
        }
    ],

最新更新