Как дополнить данные, предоставленные моделью CActiveRecord в Yii?

Я работаю над приложением Yii 1.1.16 и испытываю следующие трудности:

Есть модель FooModel на основе CActiveRecord, За ней стоит таблица базы данных bar_table с очень неудобной структурой данных:

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

Это означает, что я получаю почти все данные в виде строки JSON. (Да, это безумие, но теперь я принимаю это как данность.)

В представлении данные должны быть переданы CGridView виджет и отображается в виде таблицы. Это означает, что я должен изменить данные, чтобы отобразить их.

Я вижу возможности / места для этого:

  1. На уровне модели, вероятно, в классе модели. Затем виджет получит измененные данные и обработает их как обычно.
  2. На слое вида, вероятно, в файле вида. Затем мне придется изменить данные, полученные от модели, и каким-то образом передать их виджету.

Какой подход лучше (или, может быть, есть гораздо более элегантный и как его реализовать?

2 ответа

Вы можете использовать метод / событие afterFind для обработки ваших данных json

class Foo extends CActiveRecord {

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

Вот уродливое решение (уродливое, потому что используется публичное свойство), в любом случае оно работает:

модельный класс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',
    ),
));
Другие вопросы по тегам