0

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

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

我的第一个猜测是使用 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
}
4

2 回答 2

3

这样做的正确方法是,在您的模型中有一个 afterFind 方法,例如:

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

仅此而已,当您使用 AR 的方法时,每个找到的模型都会通过afterFind()并根据需要更改someAttribute

于 2013-05-28T18:56:35.660 回答
0

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

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

然后,您可以使用geoAsString常规(只读)属性。如果你想让它可写,你也可以添加一个 setter 方法。

于 2013-05-29T13:44:56.710 回答