如何在雄辯的ORM中處理mysql空間數據類型?這包括如何創建遷移,插入空間數據和執行空間查詢。如果沒有實際的解決方案存在,是否有任何解決方法?處理Laravel中的Mysql空間數據類型Eloquent ORM
16
A
回答
9
我已經在不久前實施的解決方法是對具有下列驗證模型中的緯度和經度字段(見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說,你可以隨時使用模式:創建和DB ::聲明方法來定製遷移。
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
它可以使用https://github.com/grimzy/laravel-mysql-spatial
你可以使用:
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',
];
}
那麼你就能夠在 '位置' 字段運行查詢。
存儲模型,你可以使用:
$place1 = new Place();
$place1->name = 'Empire State Building';
$place1->location = new Point(40.7484404, -73.9878441);
$place1->save();
到檢索模型,你應該使用:
$place2 = Place::first();
$lat = $place2->location->getLat(); // 40.7484404
$lng = $place2->location->getLng(); // -73.9878441
相關問題
- 1. 處理SQL Server 2012表中的空間數據類型
- 2. MySQL位數據類型存儲空間
- 3. 處理SQL時間數據類型
- 4. 如何在FileHelper類中處理SQLDecimal數據類型的空值
- 5. 如何處理Laravel 5中的BIT數據類型?
- 6. 在命名空間中處理名稱空間模型(類)
- 7. Laravel Eloquent截斷數據類型double雙精度值
- 8. Laravel 4,如何防止Eloquent模型處理某些屬性?
- 9. MongoDB數據類型處理
- 10. 空間數據類型
- 11. 如何處理使用DBSCAN與python進行空間聚類的類型數據?
- 12. MySql中的間隔數據類型
- 13. 處理SOAP中的時間數據類型
- 14. 處理MySQL和PHP/Laravel中的數百萬條數據記錄
- 15. 處理C#中SQL的空類型
- 16. 保存模型時,MySQL/Laravel處理空值
- 17. Laravel Eloquent分頁
- 18. Laravel 5.1 eloquent不支持的操作數類型
- 19. Laravel不能使用Eloquent/Builder類型的對象作爲數組
- 20. 處理Laravel數據庫查詢中的空值?
- 21. 如何處理空值與數據類型float的表列
- 22. 如何處理Laravel中的JSON數據?
- 23. 使用MYSQL處理XML數據類型的問題
- 24. 未知/未處理的數據類型
- 25. x86-64處理器的數據類型
- 26. Mysql地理空間點數據庫
- 27. Laravel 5.2聯合/加入數據庫和Eloquent的模型查詢
- 28. Laravel with Eloquent不保存數據庫的模型屬性
- 29. 時間數據類型 - MySQL的
- 30. php - laravel:如何處理數據庫中的時間重疊?
也許這可以幫助你:http://www.codetutorial.io/geo -spatial-mysql-laravel-5/ – haakym
@haakym提供的鏈接非常有用。 Laravel本身不支持這些類型(請看這裏https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Schema/Blueprint.php),但你總是可以運行一個DB:statement()in您的遷移或甚至擴展Blueprint類並添加您自己的方法來支持這些數據類型。我個人使用DB語句方法。 – jhmilan