2015-06-06 19 views
16

Mysql uzamsal veri türleri nasıl işlenir ORM ?, Bu, geçiş oluşturma, uzamsal veri ekleme ve uzamsal sorguların nasıl gerçekleştirileceğini içerir. Mevcut çözümler yoksa, herhangi bir geçici çözüm var mı?Taşıma Mysql Dairesel mekansal veri kümeleri Elovel ORTA

+8

Belki bu konuda yardım edebilirim: http://www.codetutorial.io/geo -spatial-mysql-laravel-5/ – haakym

+0

@haakym tarafından sağlanan bağlantı çok yararlıdır. Laravel bu türleri doğal olarak desteklemez (https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Schema/Blueprint.php adresine bakın) ancak her zaman DB: statement() geçişleriniz, hatta Blueprint sınıfını genişletti ve bu veri tiplerini desteklemek için kendi yöntemlerinizi ekleyin. Şahsen ben DB deyim yaklaşımını kullanıyorum. – jhmilan

cevap

9

Bir süre önce uygulamış bir geçici çözüm aşağıdaki doğrulamaları ile model üzerinde bir enlem ve boylam alanlara sahip olmaktır (Validator class bakınız):

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

sihirli modelin boot method üzerine geldiği @jhmilan her zaman Şeması kullanabilirsiniz :: göç özelleştirmek için yöntemler oluşturmak ve DB :: denildi gibi göçler hakkında

/** 
* 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); 
     } 

    }); 
} 

: mekansal noktası alanının doğru değeri ayarlar.

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)'); 
+0

artık Innodb motorunda Spatial veri türü üzerinde indeks oluşturabilirsiniz. (Mysql 5.7) – Mehrdad

+0

'geoToPoint()' nereden geldi? – dbr

+0

geoToPoint yalnızca enlem ve boylamı birleştirmek için yardımcı bir işlevdir, aşağıdakileri döndürür: $ enlem. "". $ Boylam; –

0

Size kullanabilir https://github.com/grimzy/laravel-mysql-spatial

kullanmak mevcuttur:

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', 
    ]; 
} 

o zaman 'yeri' alanına sorgu çalıştırabilmek edebiliyoruz. mağaza modeline

aşağıdakileri kullanabilirsiniz:

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

bir model almak için kullanmalısınız:

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