在CakePHP中保存空间数据

时间:2013-05-20 10:35:39

标签: php mysql cakephp spatial cakephp-2.3

我在使用saveAll()在CakePHP中保存空间数据时遇到问题。我真的不想手动编写查询(Handling spatial data in CakePHP),因为有许多模型被保存。

我也读了CakePHP and MySQL Spatial Extension但是当我尝试这样做时,$db->expression()会返回一个stdClass。

这是打印出的返回对象:

stdClass Object
(
    [type] => expression
    [value] => GeomFromText('POINT(48.18879 18.527579999999944)')
)

如果我在CakePHP and MySQL Spatial Extension中使用此对象并尝试使用saveAll()保存它,我会收到此错误:

错误:无法使用stdClass类型的对象作为数组
文件:/www/s/t/u47728/public_html/lib/Cake/Model/Model.php
行:2221

如果我使用value属性,它会在查询中转义,因此它只是一个字符串。然后我收到了这个错误:

错误:SQLSTATE [22003]:数值超出范围:1416无法从发送到GEOMETRY字段的数据中获取几何对象

saveAll()是否支持表达式?

更新

显然,同样适用于save()函数和其他函数....还有saveField()

2 个答案:

答案 0 :(得分:6)

转换此行:

$this->data['Report']['position'] = $db->expression("GeomFromText('POINT(" . 
    $this->data['Report']['lat'] . " " . $this->data['Report']['lng'] . ")')");

到:

$this->data['Report']['position'] = (object) $db->expression("GeomFromText('POINT(" .
     $this->data['Report']['lat'] . " " . $this->data['Report']['lng'] . ")')");

它应该有用。

答案 1 :(得分:1)

您还应该更改数据的顺序。

正确的方法是: POINT(经度纬度)

由于我没有足够的声誉,因此无法对正确的答案发表评论。