【问题标题】:PropelORM with MySQL SPATIAL data type具有 MySQL SPATIAL 数据类型的 PropelORM
【发布时间】:2012-10-10 20:44:27
【问题描述】:

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

我正在使用设置字段值

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

我想这个字符串被 ORM 当作字符串值对待,GeomFromText 没有被当作应有的函数对待。

很遗憾,没有Criteria::CUSTOM 用于设置字段值。

如何使用 PropelORM 更新这些字段?

更新:ZendFramework 中有Zend_Db_Expr 用于此类任务,也许PropelORM 中有类似的东西?

【问题讨论】:

    标签: php mysql pdo propel spatial-index


    【解决方案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();
    }
    

    【讨论】:

    • 我猜想doUpdate()中的Criteria::CUSTOM有问题,但是没有足够的时间去测试。我也会发布我对这个变体的研究。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多