登录
首页 >  Golang >  Go问答

使用 GORM 和 PostgreSQL 查找 10 公里半径周围的所有行

来源:stackoverflow

时间:2024-04-16 10:30:32 129浏览 收藏

本篇文章给大家分享《使用 GORM 和 PostgreSQL 查找 10 公里半径周围的所有行》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我想列出startaddress周围10公里半径内的races(连接表address

这就是我的模型的编写方式:

    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 编写使用 postgresql 的 cubeearthdistance 扩展的查询。

我已经添加了扩展:

create extension cube;

create extension earthdistance;

类似,但使用 gorm 语法并按距离排序:

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

解决方案


您在那里的查询可以在 gorm 中完成,如下所示:

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(...). 替换为:

    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,
        },
    }).

理论要掌握,实操不能落!以上关于《使用 GORM 和 PostgreSQL 查找 10 公里半径周围的所有行》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>