使用 GORM 和 PostgreSQL 查找半径 10 公里左右的所有行
Find all rows around 10km radius with GORM and PostgreSQL
我想列出StartAddress
周围10km半径内的races
(加入tableAddress
)
我的模型是这样写的:
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 编写使用 cube
& earthdistance
扩展的查询。
我已经添加了扩展:
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,
},
}).
我想列出StartAddress
周围10km半径内的races
(加入tableAddress
)
我的模型是这样写的:
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 编写使用 cube
& earthdistance
扩展的查询。
我已经添加了扩展:
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,
},
}).