2016-12-21 4 views
1

Ich benutze PostgreSQL + PostGIS Setup, und ich möchte geom Spalte aus der Datenbank als GeoJSON abrufen. Ich weiß, dass ich das mit ST_AsGeoJSON() Funktion tun kann. So verwende ich diesen Code alle Länder zu holen:Laravels eloquente Nachbearbeitungsabfrage

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

Aber ich am Ende mit $countries[i]->geom ein String ist, so muss ich für Schleife, dies zu tun:

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

I Ich möchte diese Codezeile in das Eloquent-Modell verschieben, damit ich mir keine Sorgen machen muss, wenn ich die Spalte entziffern möchte oder nicht. Gibt es eine Methode, die ich überschreiben oder irgendeine Art, diese spezielle Funktionalität meinem Ländermodell hinzuzufügen?

Antwort

2

folgendes Modell

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

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

+0

Ich benutze die 5.1 LTS-Version, aber das funktioniert, auch wenn man "geom" => "json" macht. Aber, ich habe Laravel-Code überprüft, es tatsächlich 'json_decode()' jedes Mal wenn ich nach diesem Attribut frage ... Antwort von Oseintow ist gut, wenn ich mich an decodierten Wert erinnere. – clzola

1

Mit Mutator/Accessor können Sie die Werte in Ihrem Modell überschreiben oder decodieren. Also in Ihrem Modell folgendes tun.

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

Mit diesem können Sie geom auf verschiedenen Teil Ihrer Anwendung zugreifen, ohne es zu entschlüsseln.

+0

hinzufügen, aber nicht, dass ineffizient auf großen Skalen, es jedes Mal decodiert. Ich könnte eine private Variable machen, um zu überprüfen, ob sie bereits decodiert ist und den Wert zurückgeben ... – clzola