如何在Laravel 4模型中为POINT数据列创建Accessor?

时间:2014-04-17 15:11:16

标签: php mysql laravel geospatial point

我有一个user_sessions表,其中有一个名为" geo_location"的列,它是一个POINT列,用于存储用户当前位置的纬度和经度值,如果它不可用,则为NULL。

当我在Laravel中创建一个绑定到该表的模型时,它只在完全隐藏geo_location字段时才有效。否则会抛出JSON错误,因为它没有正确查询geo_location列中的单独X和Y值。

有没有办法可以在我的Laravel模型中创建一个Accessor,它可以在数据显示之前对其进行操作,以便我可以将它包含在我的结果中?

我是否需要修改我的UserSessions控制器并添加一个get()函数来代替使用原始SQL?

1 个答案:

答案 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脚本轻松返回经度/纬度。 : - )

我希望这可以让您了解如何创建访问者。