我试图在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列希望您返回字符串,并且当尝试使用调用yiii18nFormatter
的yiigridDataColumn::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
}
],