gpt4 book ai didi

php - 查询在 MySQL 中有效,但不适用于 Lumen/Laravel - 数值超出范围 : 1416

转载 作者:可可西里 更新时间:2023-11-01 08:24:21 25 4
gpt4 key购买 nike

我很难过...很简单,我正在尝试更新 MySQL 数据库中的几何记录,但由于某种原因,它失败了。但是,当 Lumen 抛出 QueryException 时,它显示正在执行的查询;

UPDATE `user_locations` SET `current_location` = ST_GeomFromText('POINT(1 1)') WHERE user_id = 1

当我通过命令行在 MySQL 中执行上述查询时,有效,但由于某种原因,它无法通过 Laravel/Lumen/PDO/Eloquent(不是确定是哪一个导致了问题)。

这是抛出的错误:

SQLSTATE[22003]: Numeric value out of range: 1416 Cannot get geometry object from data you send to the GEOMETRY field (SQL: update `user_locations` set `current_location` = ST_GeomFromText('POINT(1 1)') where `user_id` = 1)

能想到的我都试过了;

  • 正在降级 MySQL(我看到其他人对 Mysql 5.7 也有类似的问题)
  • 直接从 Eloquent 转储查询和绑定(bind)以查看实际发送到 MySQL 的内容(见下文)
  • 更换数据库引擎(目前是InnoDB)
  • 删除 current_location 列的空间索引

还有什么可能导致这种情况?它不能是 MySQL,因为它通过命令行工作,所以它肯定是 Laravel/Eloquent/PDO 中的东西吧?

附加信息

  • 我正在运行 MySQL 5.7(我也试过 5.6,但它抛出了完全相同的错误)
  • 我正在使用 Lumen,但我认为这无关紧要,因为 Laravel 和 Lumen 都使用 Eloquent
  • 我正在使用 https://github.com/grimzy/laravel-mysql-spatial这(我相信)是相关代码:
  • 更新 - 我认为这无关紧要,但此特定表上还有另一个 point 字段,但由于我没有更新该字段,它应该是在查询中完全被忽略,因此,不相关...

Builder extends Illuminate\Database\Eloquent\Builder

/**
* Update a record in the database.
*
* @param array $values
* @return int
*/
public function update(array $values) : int
{
foreach ($values as $key => &$value) {
if ($value instanceof GeometryInterface) {
$value = $this->asWKT($value);
}
}

return parent::update($values);
}

/**
* Set the MySQL for the geometry field.
*
* @param GeometryInterface $geometry
* @return string
*/
protected function asWKT(GeometryInterface $geometry) : string
{
return $this->getQuery()->raw("ST_GeomFromText('" . $geometry->toWKT() . "')");
}

此外,我还尝试了以下方法:

Illuminate\Database\Query\Builder

public function update(array $values)
{
$sql = $this->grammar->compileUpdate($this, $values);

dd($sql, $values, $this->cleanBindings(
$this->grammar->prepareBindingsForUpdate($this->bindings, $values)
));

return $this->connection->update($sql, $this->cleanBindings(
$this->grammar->prepareBindingsForUpdate($this->bindings, $values)
));
}

这个输出:

string(70) "update `user_locations` set `current_location` = ? where `user_id` = ?"
array(1) {
["current_location"]=>
&string(47) "ST_GeomFromText('POINT(1 1)')"
}
array(2) {
[0]=>
&string(47) "ST_GeomFromText('POINT(1 1)')"
[1]=>
int(1)
}

最佳答案

看这里:

Illuminate\Database\Query

/**
* Create a raw database expression.
*
* @param mixed $value
* @return \Illuminate\Database\Query\Expression
*/
public function raw($value)
{
return $this->connection->raw($value);
}

raw 的返回值不是string,而是\Illuminate\Database\Query\Expression。因此,通过将 asWkt 的返回值转换为 string,它会强制 Eloquent 用引号将其括起来,从而抛出我们所看到的错误。

关于php - 查询在 MySQL 中有效,但不适用于 Lumen/Laravel - 数值超出范围 : 1416,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47392658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com