我有一个user_sessions表,其中有一个名为" geo_location"的列,它是一个POINT列,用于存储用户当前位置的纬度和经度值,如果它不可用,则为NULL。
当我在Laravel中创建一个绑定到该表的模型时,它只在完全隐藏geo_location字段时才有效。否则会抛出JSON错误,因为它没有正确查询geo_location列中的单独X和Y值。
有没有办法可以在我的Laravel模型中创建一个Accessor,它可以在数据显示之前对其进行操作,以便我可以将它包含在我的结果中?
我是否需要修改我的UserSessions控制器并添加一个get()函数来代替使用原始SQL?
答案 0 :(得分:1)
如果您正在使用PostGreSQL + PostGIS,我就是这样做的L4.1
location是类型几何(POINT),使用迁移表中的原始SQL查询
创建表:
DB::statement("ALTER TABLE places ADD COLUMN location GEOMETRY(POINT, 4326)");
型号:
class Place extends Eloquent{
//mass assignment of fillable field
#fillable
protected $fillable = array('name', 'attribute', 'location');
// if you want to include your POINT data as a JSON attribute
#append
protected $append = array('location');
// the DB:raw statement is particular to PostGreSQL + PostGIS, a native function of PostGIS
// basically, find the id of the referred place
// and run the PostGIS function that turns the geometry type to wkt text.
#accessor
public function getLocationAttribute(){
$id = $this->attributes['id'];
$wkt = DB::table('places')->find( $id, array(DB::raw('ST_AsText(location) AS location')));
$location = $wkt->location;
return $location;
}
}
使用REST的示例输出如下所示:
{域} /地点/ {1}
{
id: 1,
name: "Yellowstone",
created_at: "2014-05-19 08:19:51",
updated_at: "2014-05-19 08:19:51",
location: "POINT(121.1 14.4)"
}
注意:
使用默认访问者
$this->attributes['location']
返回十六进制对象,而不是字符串。所以我选择使用带有PostGIS功能的原始查询。
{
id: 1,
name: "Yellowstone",
created_at: "2014-05-19 08:19:51",
updated_at: "2014-05-19 08:19:51",
location: "0101000020E61000006666666666465E40CDCCCCCCCCCC2C40"
}
从WKT,我希望你可以使用原生的PHP脚本轻松返回经度/纬度。 : - )
我希望这可以让您了解如何创建访问者。