with updateorcreate deleted_at create php laravel eloquent laravel-5 geospatial

php - updateorcreate - where like laravel



Manejo de tipos de datos espaciales Mysql en Laravel Eloquent ORM (2)

¿Cómo manejar los tipos de datos espaciales de mysql en ORM elocuente ?, esto incluye cómo crear la migración, insertar datos espaciales y realizar consultas espaciales. Si no existe una solución real, ¿hay soluciones alternativas?


Está disponible para usar https://github.com/grimzy/laravel-mysql-spatial

puedes utilizar:

namespace App; use Illuminate/Database/Eloquent/Model; use Grimzy/LaravelMysqlSpatial/Eloquent/SpatialTrait; /** * @property /Grimzy/LaravelMysqlSpatial/Types/Point $location */ class Place extends Model { use SpatialTrait; protected $fillable = [ ''name'', ]; protected $spatialFields = [ ''location'', ]; }

entonces puede ejecutar consultas en el campo ''ubicación''.

para guardar el modelo puedes usar:

$place1 = new Place(); $place1->name = ''Empire State Building''; $place1->location = new Point(40.7484404, -73.9878441); $place1->save();

Para recuperar un modelo debes usar:

$place2 = Place::first(); $lat = $place2->location->getLat(); // 40.7484404 $lng = $place2->location->getLng(); // -73.9878441


Una solución que he implementado hace un tiempo es tener campos de latitud y longitud en el modelo con las siguientes validaciones (consulte la clase Validador ):

$rules = array(''latitude'' => ''required|numeric|between:-90,90'', ''longitude''=>''required|numeric|between:-180,180'',)

La magia viene con el método de arranque del modelo, que establece el valor correcto del campo de punto espacial:

/** * Boot method * @return void */ public static function boot(){ parent::boot(); static::creating(function($eloquentModel){ if(isset($eloquentModel->latitude, $eloquentModel->longitude)){ $point = $eloquentModel->geoToPoint($eloquentModel->latitude, $eloquentModel->longitude); $eloquentModel->setAttribute(''location'', DB::raw("GeomFromText(''POINT(" . $point . ")'')") ); } }); static::updated(function($eloquentModel){ if(isset($eloquentModel->latitude, $eloquentModel->longitude)){ $point = $eloquentModel->geoToPoint($eloquentModel->latitude, $eloquentModel->longitude); DB::statement("UPDATE " . $eloquentModel->getTable() . " SET location = GeomFromText(''POINT(" . $point . ")'') WHERE id = ". $eloquentModel->id); } }); }

Acerca de las migraciones, como @jhmilan dice que siempre se pueden usar los métodos Schema :: create y DB :: statement para personalizar la migración.

Schema::create(''locations'', function($table){ $table->engine = "MYISAM"; $table->increments(''id'')->unsigned(); $table->decimal(''latitude'', 10, 8); $table->decimal(''longitude'', 11, 8); $table->timestamps(); }); /*Espatial Column*/ DB::statement(''ALTER TABLE locations ADD location POINT NOT NULL'' ); /*Espatial index (MYISAM only)*/ DB::statement( ''ALTER TABLE locations ADD SPATIAL INDEX index_point(location)'' );