1

私はPropelORM 1.6プロジェクトにある種のGISサービスを使用して実装しています。データベース(MySQL)では、座標として、さまざまなアイテムの座標を格納するためにPOINTのフィールドタイプを使用しています。

schema.xmlテーブルモデルを構築するために、AFAIK空間データ型がまだサポートされていないため、この(POINT)フィールドをに設定しましVARCHAR(255)

このフィールドの選択クエリの整理は、を使用してOKですCriteria::CUSTOMが、Propelでよく知られているものを使用してこのフィールドを更新したい場合、GeomFromText次のエラーが発生します。

警告:PDOStatement :: execute():SQLSTATE [22003]:数値が範囲外です:1416/var/www/.../propel/util/BasePeer.phpのGEOMETRYフィールドに送信したデータからジオメトリオブジェクトを取得できません425行目

を使用してフィールド値を設定しています

$object->setGeo("GeomFromText( 'POINT(48.211055 16.383728)' )");

この文字列はORMによって文字列値のように扱われ、本来GeomFromTextの関数としては扱われないと思います。

残念ながら、Criteria::CUSTOMフィールド値を設定することはできません。

PropelORMでそのようなフィールドを更新するにはどうすればよいですか?

更新:この種のタスクにZendFrameworkZend_Db_Expr、PropelORMに似たようなものがあるのではないでしょうか?

4

1 に答える 1

1

私が今見つけた解決策は、カスタム クエリを使用しGEOMETRY、レコードが保存された後にフィールドを更新することです。

これは、機能を拡張するために使用している関数です。

/**
 * Update spatial data field from numerical values of record
 * If record ID is not defined - all records will be updated from their own values
 *
 * @param int $record Record ID to update
 */
public function updateGEO($record = null) {

    $sql = 'UPDATE `'.TablePeer::TABLE_NAME.'` SET '.TablePeer::GEO.' = GeomFromText(CONCAT( \'POINT(\', '.TablePeer::LATITUDE.', \' \', '.TablePeer::LONGITUDE.', \')\' ))'.(!empty($record) ? ' WHERE '.TablePeer::ID.' = '.$record : null);

    return \Propel::getConnection(TablePeer::DATABASE_NAME)
            ->prepare($sql)
            ->execute();
}
于 2012-11-12T15:51:51.567 に答える