php - 在 Laravel Eloquent ORM 中处理 Mysql Spatial 数据类型

标签 php laravel eloquent laravel-5 geospatial

如何在 eloquent ORM 中处理 mysql 空间数据类型?,这包括如何创建迁移、插入空间数据和执行空间查询。如果不存在实际的解决方案,是否有任何解决方法?

最佳答案

我刚才实现的一个解决方法是在模型上有一个纬度和经度字段并进行以下验证(参见 Validator class ):

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

魔法降临 boot method模型,它设置了空间点字段的正确值:

/**
 * 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 方法来自定义迁移。

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

关于php - 在 Laravel Eloquent ORM 中处理 Mysql Spatial 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30682538/

相关文章:

mysql - Laravel 迁移不兼容的外键

Laravel - 获取与 "whereHas"的嵌套关系

php - 使用 JQuery、AJAX 和 php 创建 JSON 数据

php - laravel action() 辅助方法中的欺骗请求方法?

laravel 不能在 nginx 中作为别名工作

mysql - laravel 没有看到我的本地主机数据库错误 : SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected

php - 从钱包系统计算可用余额,不包括过期信用

java - 如何从 php 向 java/android 发送和检索数据?

php - 函数中的多个数组未显示在使用 php mysql 的结果中

php - 使用 Eloquent 查找或创建