具有MySQL SPATIAL数据类型的PropelORM

时间:2012-10-20 10:59:21

标签: php mysql pdo propel spatial-index

我正在使用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/中的GEOMETRY字段的数据中获取几何对象第425行的BasePeer.php

我正在使用

设置字段值
  

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

我认为这个字符串被ORM视为字符串值,GeomFromText不被视为应该的函数。

不幸的是,设置字段值没有Criteria::CUSTOM

如何使用PropelORM更新此类字段?

更新ZendFramework这类任务有Zend_Db_Expr,也许PropelORM中有类似内容?

1 个答案:

答案 0 :(得分: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();
}