Как дополнить данные, предоставленные моделью CActiveRecord в Yii?
Я работаю над приложением Yii 1.1.16 и испытываю следующие трудности:
Есть модель FooModel
на основе CActiveRecord
, За ней стоит таблица базы данных bar_table
с очень неудобной структурой данных:
id: integer
some_column: string
data: string <- JSON
Это означает, что я получаю почти все данные в виде строки JSON. (Да, это безумие, но теперь я принимаю это как данность.)
В представлении данные должны быть переданы CGridView
виджет и отображается в виде таблицы. Это означает, что я должен изменить данные, чтобы отобразить их.
Я вижу возможности / места для этого:
- На уровне модели, вероятно, в классе модели. Затем виджет получит измененные данные и обработает их как обычно.
- На слое вида, вероятно, в файле вида. Затем мне придется изменить данные, полученные от модели, и каким-то образом передать их виджету.
Какой подход лучше (или, может быть, есть гораздо более элегантный и как его реализовать?
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',
),
));