6

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

我也阅读了这个CakePHP 和 MySQL 空间扩展,但是当我尝试做同样的事情时,$db->expression()返回一个 stdClass。

这是打印出来的返回对象:

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

如果我以在CakePHP 和 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()

4

2 回答 2

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'] . ")')");

它应该工作。

于 2013-05-20T13:36:31.397 回答
2

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

正确的方法是:POINT(longitude latitude)

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

于 2014-11-26T11:57:41.340 回答