首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用GORM和PostgreSQL查找半径10公里左右的所有行

用GORM和PostgreSQL查找半径10公里左右的所有行
EN

Stack Overflow用户
提问于 2021-02-01 05:46:52
回答 1查看 362关注 0票数 0

我想列出racesStartAddress周围10公里范围内(连接表Address)。

我的模型就是这样写的:

代码语言:javascript
复制
    type (
        // Race model
        Race struct {
            Base // ID, CreatedAt, UpdatedAt, DeletedAt
            Title          string            `json:"title" gorm:"title;"`
            StartAddress   Address           `json:"startaddress" gorm:"foreignKey:StartAddressID"`
            StartAddressID string            `json:"start_address_id" gorm:"type:char(36);start_address_id;"`
            EndAddress     Address           `json:"endaddress" gorm:"foreignKey:EndAddressID"`
            EndAddressID   string            `json:"end_address_id" gorm:"type:char(36);end_address_id;"`
            StartDate      time.Time         `json:"start_date" gorm:"start_date;"`
            EndDate        time.Time         `json:"end_date" gorm:"end_date;"`
        }

        Address struct {
            Base // ID, CreatedAt, UpdatedAt, DeletedAt
            Street  string  `json:"street" gorm:"street;"`
            Zipcode string  `json:"zipcode" gorm:"zipcode;"`
            City    string  `json:"city" gorm:"city;"`
            Lat     float64 `json:"lat" gorm:"lat;"`
            Lng     float64 `json:"lng" gorm:"lng;"`
        }
    )

要查询我的数据库,我使用GORM v2

我不知道如何通过GORM编写使用cube & earthdistance扩展和PostgreSQL的查询。

我已经添加了以下扩展:

代码语言:javascript
复制
CREATE EXTENSION cube;

代码语言:javascript
复制
CREATE EXTENSION earthdistance;

就像这样,但使用GORM语法和按距离排序:

代码语言:javascript
复制
SELECT * FROM races
INNER JOIN addresses ON addresses.id = races.start_address_id
AND earth_box(ll_to_earth(48.8589507,2.2770205), 5000) @> ll_to_earth(addresses.lat, addresses.lng)
ORDER BY races.status DESC
LIMIT 100
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-02 14:43:15

您在Gorm中获得的查询可以如下所示:

代码语言:javascript
复制
var res []Race

db.Model(&Race{}).
    Joins("StartAddress").
    Where("earth_box(ll_to_earth(?,?), ?) @> ll_to_earth(addresses.lat, addresses.lng)", ptLat, ptLng, dist).
    Order("races.status DESC").
    Limit(100).
    Find(&res)

要按距离获取订单,您需要将Order(...).替换为:

代码语言:javascript
复制
    Clauses(clause.OrderBy{
        Expression: clause.Expr{
            SQL: "earth_distance(ll_to_earth(?,?), ll_to_earth(addresses.lat, addresses.lng)) ASC", 
            Vars: []interface{}{ptLat, ptLng}, 
            WithoutParentheses: true,
        },
    }).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65987726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档