首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否可以让GORM查询直接返回结果,或者总是要遍历引用?

我是否可以让GORM查询直接返回结果,或者总是要遍历引用?
EN

Stack Overflow用户
提问于 2022-03-11 16:18:14
回答 1查看 159关注 0票数 0

我有一个工作查询,其中一个字段是通过子查询设置的:

代码语言:javascript
复制
    // recreate a new user admin with the correct token
    db.
        Save(&Token{
            Value: adminToken,
            User: User{
                UserName: "admin",
                IsAdmin:  true,
                UserType: dbGetUserTypeByName("secops"),  // ← this line
            },
        })

UserType是类型的

代码语言:javascript
复制
// UserType is the type of the user: internal, external, ...
type UserType struct {
    ID     uint
    Name   string
    UserID uint // backref to User has-many
}

表被初始化为

代码语言:javascript
复制
db.Create([]UserType{
    {Name: ""}, // empty: will be the default for just a main courante
    {Name: "secops"},
    {Name: "company"},
    {Name: "external"},
    {Name: "api"},
})

最后,子查询dbGetUserTypeByName()

代码语言:javascript
复制
func dbGetUserTypeByName(name string) (userType UserType) {
    db.
        Where(UserType{Name: name}).
        First(&userType)
    return userType
}

所有这些都很好,我的问题是:在初始化问题中的第一个条目时,可以直接使用dbGetUserTypeByName() 中的查询结果吗?

换句话说:是否有一种方法可以跳过助手函数dbGetUserTypeByName的使用?

在我看来(我对GORM或SQL没有经验),db.*调用返回的内容是DB类型,并且不包含查询的实际结果(在作为引用传递的变量中检索)。

我想象,在不工作的伪戈姆码中,大概是:

代码语言:javascript
复制
    // recreate a new user admin with the correct token
    db.
        Save(&Token{
            Value: adminToken,
            User: User{
                UserName: "admin",
                IsAdmin:  true,
                UserType: db.Where(UserType{Name: "secops"}).First(),  // ← this does not work of course, but you get the idea
            },
        })
EN

回答 1

Stack Overflow用户

发布于 2022-04-06 13:37:30

一些GORMS方法,如db.Save ()和db.Create(),返回带有参数的结果。在参数中,您可以找到一个名为的方法,它包含返回结果参数。

示例:

代码语言:javascript
复制
type Entity struct {
  ID string `json:"id"`
  Title string `json:"title"`
}
代码语言:javascript
复制
func CreateEntity (createEntity Entity) (creaeteEntityDB *Entity, err error) {

    result := r.db.Create(&createEntity)

    er := result.Error

    if er != nil {
        return nil, err
    }

    return &createEntity, nil
}

第二方法

也可以使用参数。

代码语言:javascript
复制
func CreateEntity (createEntity Entity) (creaeteEntityDB interface{}, err error) {

    result := r.db.Create(&createEntity)

    er := result.Error

    if er != nil {
        return nil, err
    }

    return result.Value, nil
}

但我个人建议使用第一种方法,因为默认情况下,Gorm不键入参数参数的类型类似于interface{},这与任何类型一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71441507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档