0

モデルに属性があり、データベース内にバイナリ形式で保存されています。アトリビュートがジオメトリック(ポリゴン)オブジェクトの場合。

このオブジェクトは、複数の文字列表現にキャストできます。では、検索の実行後に、返されたセットのみの属性を変更できるようにするイベントをどのようにアタッチできますか?

私の最初の推測は 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

さまざまな形式のゲッターを作成することもできます。

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 に答える