我在GO中写了一个REST API应用程序,该应用程序使用Gorm为ORM。在某些部分进行重构时,我想将一些常见的操作移至外部功能ApplyToDBQuery(query *gorm.DB)
,该功能将指针用于DB查询并修改它,以便以后可以使用修改的查询。
示例用法:
query = shared.DB.Debug()
req.ApplytoDBQuery(query)
if query.find(&data).Error != nil {...}
func (this *MyCustomRequest) ApplyToDBQuery(query *gorm.DB) {
query.Limit(...)
query.Offset(...)
query.Where(...)
}
我想,由于我将指针传递到该功能,因此应该修改原始查询,但原始查询实际上没有发生任何事情。
我还尝试将指针传递给指针ApplyToDBQuery(query **gorm.DB)
,返回修改后的指针ApplyToDBQuery(query *gorm.DB) *gorm.DB
,并且由于缺乏想法,即使是这两个组合的组合-ApplyToDBQuery(query **gorm.DB) *gorm.DB
gorm对象在每个操作中克隆本身,因此永远不会更改原始尖头值。
您应该返回最新版本的gorm.db:
return query.Limit(...).Offset(...).Where(...)
将方法接收器更改为
func (this *MyCustomRequest) ApplyToDBQuery(query *gorm.DB) *gorm.DB {
return query.Limit(...).
Offset(...).
Where(...)
}
然后将其用作:
query = req.ApplytoDBQuery(query)
if query.find(&data).Error != nil {...}
原因已经由 @r3v4n
您应该使用前两个答案,但是,如果出于某种原因,您必须对指针中传递的更改 apply ,您仍然可以"手动"做。
query = shared.DB.Debug()
req.ApplytoDBQuery(query)
if query.find(&data).Error != nil {...}
func (r *MyCustomRequest) ApplyToDBQuery(query *gorm.DB) {
q := query.Limit(...).Offset(...).Where(...)
*query = *q
}
作为旁注,通常不鼓励使用接收器名称(例如this
和self
),而是首选的方法是使用简短的方法,例如1至3个字母,缩写类型的名称。
例如:
func (r *Request) AddCookie(c *Cookie)
func (c *Client) Get(url string) (resp *Response, err error)
func (srv *Server) ListenAndServe() error
补充 @r3v4n答案:
- 使用链接
- 使用
db.Scopes
进行代码重新使用而不是通常的func调用。
可以这样:
query = shared.DB.Debug()
if query.Scopes(req.ApplyToDBQuery).find(&data).Error != nil {
// handle error
}
func (this *MyCustomRequest) ApplyToDBQuery(query *gorm.DB) *gorm.DB {
return query.Where(...).Limit(...).Offset(...)
}