1

我正在PropelORM 1.6为一个项目使用和实施某种 GIS 服务。在数据库 ( MySQL ) 中,对于坐标,我使用 POINT 字段类型来存储各种项目的坐标。

schema.xml构建表模型时,我已将此(POINT)字段设置为VARCHAR(255),因为尚不支持 AFAIK 空间数据类型。

使用 组织该字段的选择查询是可以的Criteria::CUSTOM,但是当我想更新这个字段时,使用众所周知GeomFromText的 Propel,我得到下一个错误:

警告: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 更新这些字段?

更新:对于这类任务,PropelORM 中可能有类似的东西吗ZendFrameworkZend_Db_Expr

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 回答