我的模型中有一个属性,它以二进制格式存储在数据库中。 如果属性是几何(多边形)对象。
此对象可以转换为多个字符串表示形式。 那么如何在查找执行后附加一个事件,允许我只更改返回集合的属性?
我的第一个猜测是使用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
}
答案 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方法。