如何在Yii中完成CActiveRecord模型提供的数据?

时间:2015-06-19 12:45:57

标签: php yii cgridview yii-cactiverecord

我正在使用Yii 1.1.16应用程序并遇到以下困难:

基于FooModel的模型CActiveRecord。它背后是一个数据库表bar_table,数据结构非常不方便:

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

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

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

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

  1. 在模型层上,可能在模型类中。然后,小部件将获取修改后的数据并照常处理。
  2. 在视图图层上,可能在视图文件中。然后,我必须修改我从模型中获取的数据,并以某种方式将其传递给小部件。
  3. 什么是更好的方法(或者可能有更优雅的方法以及如何实施它?

2 个答案:

答案 0 :(得分: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',
    ),
));

答案 1 :(得分:0)

你可以使用&#34; afterFind&#34;处理json数据的方法/事件

class Foo extends CActiveRecord {

  protected function afterFind()
  {
     $this->data = json_decode($this->data);
  }