Postgresql Yii使用PostGis,选择经度和纬度

Postgresql Yii使用PostGis,选择经度和纬度,postgresql,yii,postgis,Postgresql,Yii,Postgis,在我的应用程序中,我将Yii与PostgreSQL和PostGIS一起使用。我有一个带有字段“位置”的模型“用户”。位置字段的内容对人类来说毫无意义,但Postgres可以使用ST_asText-method将位置字段的值转换为经度和纬度。我在模型中为经度和纬度创建了虚拟字段。保存模型时,我使用beforeSave和afterSave方法将位置设置为正确的值 我现在的问题是,我希望在创建模型时(使用数据库中的现有对象)填充纬度和经度虚拟字段。我在想,可能有beforeSelect和afterSe

在我的应用程序中,我将Yii与PostgreSQL和PostGIS一起使用。我有一个带有字段“位置”的模型“用户”。位置字段的内容对人类来说毫无意义,但Postgres可以使用ST_asText-method将位置字段的值转换为经度和纬度。我在模型中为经度和纬度创建了虚拟字段。保存模型时,我使用beforeSave和afterSave方法将位置设置为正确的值

我现在的问题是,我希望在创建模型时(使用数据库中的现有对象)填充纬度和经度虚拟字段。我在想,可能有beforeSelect和afterSelect这样的东西,我可以使用它们在查询后附加一个额外的计算列,从而能够在查询运行后处理从该额外列返回的值


这有可能吗?

我能很容易地解决这个问题。我在CActiveRecord类中寻找beforeSelect和afterSelect方法,而我本应该寻找beforeFind和afterFind

我是这样做的。欢迎提出任何改进建议:)


我能很容易地解决这个问题。我在CActiveRecord类中寻找beforeSelect和afterSelect方法,而我本应该寻找beforeFind和afterFind

我是这样做的。欢迎提出任何改进建议:)


我在Yii2遇到了这个问题,下面是我如何解决它的

  • 重写AR的
    find()
    方法并定义自己的
    ActiveQuery
    类:

    public static function find()
    {
        $query =  new MyActiveQueryClass(get_called_class());
        return $query->select('*, ST_AsGeoJSON(location) AS location');
    }
    
  • afterFind()
    中,您将获得geo json,并使用它可以获得lat/lng:

    public function afterFind()
    {
        parent::afterFind();
    
        $geoJson = json_decode($this->location, true);
        $this->lat = $geoJson['coordinates'][0];
        $this->lng = $geoJson['coordinates'][1];
    }
    
  • 这是给Yii2的。在保存之前,请记住将lat/lng转换为正确的对象。我的是地理专栏。这是一个奖励:

    public function beforeSave($insert)
    {
        //create field as expression
        if(!empty($this->lat) && !empty($this->lng))
            $this->location = new \yii\db\Expression("'POINT({$this->lat} {$this->lng})'");
    
        return parent::beforeSave($insert);
    }
    

    我在Yii2遇到了这个问题,下面是我如何解决它的

  • 重写AR的
    find()
    方法并定义自己的
    ActiveQuery
    类:

    public static function find()
    {
        $query =  new MyActiveQueryClass(get_called_class());
        return $query->select('*, ST_AsGeoJSON(location) AS location');
    }
    
  • afterFind()
    中,您将获得geo json,并使用它可以获得lat/lng:

    public function afterFind()
    {
        parent::afterFind();
    
        $geoJson = json_decode($this->location, true);
        $this->lat = $geoJson['coordinates'][0];
        $this->lng = $geoJson['coordinates'][1];
    }
    
  • 这是给Yii2的。在保存之前,请记住将lat/lng转换为正确的对象。我的是地理专栏。这是一个奖励:

    public function beforeSave($insert)
    {
        //create field as expression
        if(!empty($this->lat) && !empty($this->lng))
            $this->location = new \yii\db\Expression("'POINT({$this->lat} {$this->lng})'");
    
        return parent::beforeSave($insert);
    }