2016-12-21 93 views
1

我使用PostgreSQL + PostGIS設置,我想從數據庫中取geom列作爲GeoJSON。我知道我可以使用ST_AsGeoJSON()函數來做到這一點。所以我用這個代碼來獲取所有的國家:Laravel雄辯的後處理查詢

$countries = Country::select(["id", "name", DB::raw("ST_AsGeoJSON(geom) AS geom")])->get()

然而,我最終$countries[i]->geom是一個字符串,所以我需要有循環來做到這一點:

$countries[i]->geom = json_decode($countries[i]->geom);

我想將這一行代碼移到雄辯模型中,所以我不必擔心是否忘記解碼列。是否有我應該重寫的方法或任何方式將此特殊功能添加到我的國家/地區模型?

回答

2

以下添加到您的模型

protected $casts = [ 
    'geom' => 'array', 
]; 

https://laravel.com/docs/5.3/eloquent-mutators#array-and-json-casting

+0

我正在使用5.1 LTS版本,但是這個工作,也把''geom'=>'json''做的伎倆。但是,我檢查了laravel代碼,實際上每次我詢問這個​​屬性時都會執行'json_decode()...如果我記得解碼值,那麼從oseintow的回答是很好的。 – clzola

1

您可以使用mutator/accessor來覆蓋或解碼模型中的值。因此,在您的模型中執行以下操作。

public function getGeomAttribute() 
{ 
    return json_decode($this->attributes['geom']); 
} 

使用此功能,您可以在應用程序的不同部分訪問geom而不對其進行解碼。

+0

但是,這不是效率低下的大尺度上,每次對其進行解碼。我可以做一些私人變量來檢查它是否已經解碼並返回該值... – clzola