我将查询写在控制器部分,但根据MVC结构,逻辑在模型中,并且控制器部分仅用于发送数据,因此过去我使用的条件如下:-
INSERT into tablename (columnx, columny, etc) VALUES ('valX', 'valY', 'etc')
但是现在上述查询将使用映射更改,并且我正在编写一个函数以将其用于多种用途,以检索数据,例如:-
models.Retrieve(bson.M{"_id": Id, "is_deleted": false})
//fucntion for this query is
fucn Retrieve(query interface{}){
// do stuff
}
任何人告诉我,这是正确的方法。如果是,那么告诉我如何?
如果否,请您告诉我这个问题的示例或适合我的问题的答案。
已编辑:-
此功能也可用于通过“代码”表示conditions := make(map[string]interface{})
conditions["operator1"] = "_id"
codnitions["value1"] = id
conditions["operator2"] = "is_deleted"
conditions["value2"] = false
func Retrieve(data map[string]interface{}){
//queries here
}
它也这样写:-
models.Retrieve(bson.M{"code": Code, "is_deleted": false})
先谢谢您。
答案 0 :(得分:0)
如果我理解正确,那么您需要一个能够处理不同键值对的函数作为您的查询输入。我在Go中实现了以下步骤:
type UserResolver int
// String satisfies the Stringer interface
func (ur UserResolver) String() string {
strs := [...]string {
"ID",
"Code",
}
// return empty string if index out of bounds
if int(ur) >= len(strs) {
return ""
}
return strs[ur]
}
// Add any required functions to UserResolver that you may require,
// such as schemaKey() that returns the specified schema key value:
// In your example case "_id", "Code", "is_deleted", etc.
const (
ID UserResolver = iota
Code
)
func ResolveUser(by UserResolver, value interface{}) (User, error) {
if by.String() == "" {
return nil, fmt.Errorf("Unknown UserResolver specified")
}
if value == nil {
return nil, fmt.Errorf("Nil value provided, unable to resolve User")
}
// Query details here:
// It will be specific to your persistence model and remember to follow the
// best practices for your specific db, such as properly escaping inputs...
return User, nil
}
此方法通过将UserResolver功能扩展为可以导出或未导出的其他功能(根据您的API设计),为您提供了极大的灵活性。基本上,它使用iota(自动枚举)将各种选项映射到具有const部分中定义的公共索引的切片中。现在,您可以添加使用switch语句执行类型或条件特定工作的函数。
该函数现在可以被其他包调用,如下所示:
u, err := ResolveUser(user.ID, uid)
if err != nil {
return fmt.Errorf(
"User not found! Unable to obtain user by %s = %v",
user.ID,
uid,
)
}
条件部分可以类似地实现,然后在查找索引和查找条件之间适当分开。