【问题标题】:Laravel's eloquent post-processing queryLaravel 雄辩的后处理查询
【发布时间】:2017-05-07 05:00:12
【问题描述】:

我正在使用 PostgreSQL + PostGIS 设置,我想从数据库中获取 geom 列作为 GeoJSON。我知道我可以使用ST_AsGeoJSON() 函数来做到这一点。所以我用这段代码来获取所有国家:

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

但是,我最终得到 $countries[i]->geom 是一个字符串,所以我需要 for 循环来执行此操作:

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

我想将这行代码移到 Eloquent 模型中,这样我就不必担心是否忘记解码列。是否有我应该重写的方法或任何方式将此特殊功能添加到我的 Country 模型?

【问题讨论】:

    标签: php postgresql laravel postgis


    【解决方案1】:

    您可以使用 mutator/accessor 覆盖或解码模型中的值。因此,在您的模型中执行以下操作。

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

    有了它,您可以在应用程序的不同部分访问 geom 而无需对其进行解码。

    【讨论】:

    • 但在大规模上并不是那么低效,每次都对其进行解码。我可以创建一些私有变量来检查它是否已经解码并返回该值...
    【解决方案2】:

    将以下内容添加到您的模型中

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

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

    【讨论】:

    • 我使用的是 5.1 LTS 版本,但这有效,也可以使用 'geom' => 'json'。但是,我检查了 laravel 代码,每次我要求这个属性时它实际上都会做json_decode()...如果我记得解码的值,oseintow 的回答很好。
    猜你喜欢
    • 2018-01-26
    • 2021-07-23
    • 2017-11-11
    • 2017-06-07
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多