我正在使用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中有类似内容?
答案 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();
}