0

我正在开发一个 Yii 1.1.16 应用程序并且遇到以下困难:

有一个FooModel基于CActiveRecord. 后面是一个bar_table数据结构很不方便的数据库表:

id: integer
some_column: string
data: string <- JSON

这意味着,我将几乎所有数据作为 JSON 字符串获取。(是的,这很疯狂,但现在我接受了它。)

在视图中,数据应该传递给CGridView小部件并显示为表格。这意味着,我必须修改数据才能显示它。

我看到了这样做的可能性/地方:

  1. 在模型层上,可能在模型类中。然后小部件将获取修改后的数据并照常处理。
  2. 在视图层上,可能在视图文件中。然后我将不得不修改从模型中获得的数据并以某种方式将其传递给小部件。

什么是更好的方法(或者也许有更优雅的方法以及如何实现它?

4

2 回答 2

0

这是一个丑陋的解决方案(丑陋是因为使用了公共属性),无论如何它都有效:

模型类Foo

class Foo extends CActiveRecord {
    ...
    public $buz;
    ...
    public function findAll($condition, $params=array()) {
        $resultData = parent::findAll($condition='', $params);
        foreach ($resultData as $key => $insuranceExternal) {
            $data = json_decode($insuranceExternal->getAttribute('data'), true);
            $insuranceExternal->setAttribute('myAdditionalProperty', $data['baz']['buz']);
        }
        return $resultData;
    }
}

看法

$dataProvider = $model->search();
$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'my-grid',
    'dataProvider'=>$dataProvider,
    'filter'=>$model,
    'columns'=>array(
        ...
        'myAdditionalProperty',
    ),
));
于 2015-06-19T13:31:12.107 回答
0

您可以使用“afterFind”方法/事件来处理您的 json 数据

class Foo extends CActiveRecord {

  protected function afterFind()
  {
     $this->data = json_decode($this->data);
  }
于 2015-06-19T14:44:10.180 回答