如何更改find​​All方法返回的CActiveRecord中属性的格式?

时间:2013-05-28 18:17:24

标签: yii yii-events

我的模型中有一个属性,它以二进制格式存储在数据库中。 如果属性是几何(多边形)对象。

此对象可以转换为多个字符串表示形式。 那么如何在查找执行后附加一个事件,允许我只更改返回集合的属性?

我的第一个猜测是使用onAfterFind事件,但它没有像文档建议的那样使用创建的元素调用处理程序。我的第一次尝试是控制器中的以下内容。

// an activeRecord class
GeoTableBinaryData extends CActiveRecord {
 ... // normal active record with a table which has a binary attribute called geom
}

$model = GeoTableBinaryData::model();
$model->onAfterFind->add(
  function( CEvent $evt ){
    // get the finded object to update the geom attribute on the fly here want
    // a text representation in other case would transform it to XML or JSON
  }
);

foreach ( $model->findAll() as $geoInfo )
{
  ... // output serialized geometry
}

2 个答案:

答案 0 :(得分:3)

执行此操作的正确方法是,在您的模型中有一个afterFind方法,如:

protected function afterFind()
{
     $this->someAttribute = $this->methodToChangeTheAttribute($this->someAttribute);
     return parent::afterFind();
}

就是这样,当您使用AR的方法时,每个找到的模型都会通过afterFind()并根据需要更改someAttribute

答案 1 :(得分:0)

您还可以为不同的格式编写getter:

public function getGeoAsString()
{
    // Create the string from your DB value. For example:
    return implode(',', json_decode($this->geom));
}

然后您可以像常规(只读)属性一样使用geoAsString。如果要使其可写,也可以添加setter方法。