我之前的方案就是给每个需要查询的字段加到请求的 struct 中,然后在请求时判断是否为空,不为空时则加入到查询条件
type TransferFetchReq struct {
g.Meta `path:"/transfer/fetch" method:"post" sm:"列表转账" tags:"转账"`
types.PageReq
UserID int64 `json:"user_id" dc:"用户 ID"`
}
//在控制器中加入
if req.UserID != 0 {
u = u.Where("user_id = ?", req.UserID)
}
但是这样的方案需要给每个条件写一份代码,太耗时间了
把时间拿去写 struct 即可,如下:
type TransferFetchFilter struct {
ID int64 `json:"id"`
CreatedAt []int64 `json:"created_at" cond:"between" dc:"创建时间"`
UpdatedAt []int64 `json:"updated_at" cond:"between" dc:"更新时间"`
FromID int64 `json:"from_id" dc:"转出用户 ID"`
DestID int64 `json:"dest_id" dc:"转入用户 ID"`
Code string `json:"code"`
Type []uint `json:"type" cond:"in"`
State []uint `json:"state" cond:"in"`
}
如上,只需要写好这样的 struct ,即可完成所有字段的查询,可以通过 cond 指定查询方法 例如 LIKE/EQ/IN/NOTIN/between 等....
当然,前提是必须把对应的数据类型写对(否则不会生效)
例如查询方案为:IN 时 则数据类型必须是 []xxx
默认为 EQ 即等于 则不能是 slice 默认查询字段取 json tag 当然还可以有一个更高优先级的 tag 例如 bind 这样可以同时对一个字段提供多种查询方法 这样就方便多了....................
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.