laravel-mysql-spatial
laravel-mysql-spatial copied to clipboard
Update spatial column failed
When I want to save new object with spatial column the create is good but when I want to update existing model it fail and it give the following error:
"SQLSTATE[22003]: Numeric value out of range: 1416 Cannot get geometry object from data you send to the GEOMETRY field (SQL: update locations set point_lat_lng = -23.9878441 40.7484404, locations.updated_at = 2021-04-30 15:58:02 where id = 444).
As you can see this is the problem
point_lat_lng = -23.9878441 40.7484404 is not converted into spatial file,
And this is on insert:
insert into locations (point_lat_lng, updated_at, created_at) values (ST_GeomFromText(?, ?, 'axis-order=long-lat'), ?, ?) -
array (size=4)
0 => string 'POINT(13.4113999 52.5234051)' (length=28)
1 => int 4326
2 => string '2021-04-30 15:36:42' (length=19)
Any help or sugestion?
I got the same issue. Temporary made the worst fix by deleting and inserting the object again.
I believe this is because there is no performUpdate function in the SpatialTrait. In my environment I've taken a copy of SpatialTrait and I'm using that instead. I've added the following function just after performInsert and now my updates to points work:
protected function performUpdate(EloquentBuilder $query, array $options = [])
{
foreach ($this->attributes as $key => $value) {
if ($value instanceof GeometryInterface) {
$this->geometries[$key] = $value; //Preserve the geometry objects prior to the update
$this->attributes[$key] = new SpatialExpression($value);
}
}
$update= parent::performUpdate($query, $options);
foreach ($this->geometries as $key => $value) {
$this->attributes[$key] = $value; //Retrieve the geometry objects so they can be used in the model
}
return $update; //Return the result of the parent update
}
I can confirm that adding the performUpdate method does the trick.. can this be turned into a PR?