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?