首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Laravel雄辩ORM中处理Mysql Spatial数据类型

在Laravel雄辩ORM中处理Mysql Spatial数据类型
EN

Stack Overflow用户
提问于 2015-06-06 19:54:12
回答 2查看 9.5K关注 0票数 20

如何在雄辩的ORM中处理mysql空间数据类型?这包括如何创建迁移、插入空间数据和执行空间查询。如果没有实际的解决方案,有什么解决方法吗?

EN

回答 2

Stack Overflow用户

发布于 2015-07-15 01:07:17

我之前实现的一个解决方法是在模型上使用以下验证的纬度和经度字段(请参阅Validator class):

代码语言:javascript
复制
$rules = array('latitude' => 'required|numeric|between:-90,90',
                            'longitude'=>'required|numeric|between:-180,180',)

神奇之处在于模型的boot method,它设置空间点域的正确值:

代码语言:javascript
复制
/**
 * 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);
        }

    });
}

关于迁移,就像@jhmilan所说的,你总是可以使用Schema::create和DB::statement方法来定制迁移。

代码语言:javascript
复制
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)' );
票数 13
EN

Stack Overflow用户

发布于 2017-12-17 23:34:30

可以使用https://github.com/grimzy/laravel-mysql-spatial

您可以使用:

代码语言:javascript
复制
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',
    ];
}

然后你就可以在'location‘字段上运行查询了。

要存储模型,您可以使用:

代码语言:javascript
复制
$place1 = new Place();
$place1->name = 'Empire State Building';
$place1->location = new Point(40.7484404, -73.9878441);
$place1->save();

要检索应该使用的模型,请执行以下操作:

代码语言:javascript
复制
$place2 = Place::first();
$lat = $place2->location->getLat(); // 40.7484404
$lng = $place2->location->getLng(); // -73.9878441
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30682538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档