【问题标题】:How To Use Embedding To Get Data From A Table如何使用嵌入从表中获取数据
【发布时间】:2020-07-17 07:25:04
【问题描述】:

我是一名 PHP 程序员,我刚学了几个星期的 Golang。我正在编写 REST API 以从我的“帖子”表中获取 post 信息。我在posts_controller 中有FindPostByID 方法。这个控制器使用Post struct 这是模型

func (p *Post) FindPostByID(db *gorm.DB, pid uint64) (*Post, error) {
    var err error
    err = db.Debug().Model(&Post{}).Where("id = ?", pid).Take(&p).Error
    if err != nil {
        return &Post{}, err
    }
    if p.ID != 0 {
        err = db.Debug().Model(&User{}).Where("id = ?", p.AuthorID).Take(&p.Author).Error
        if err != nil {
            return &Post{}, err
        }
    }
    return p, nil
}

但是现在我想将方法​​FindByID 添加到父结构中,例如ParentModel,因为当我有articles_controller 时,我可以在父结构中使用FindByID 方法来获取文章信息。所以我在父结构中有以下代码

type ParentModel struct {
    
}

func (m *ParentModel) FindByID(db *gorm.DB, uid uint64) (*ParentModel, error) {
    var err error
    err = db.Debug().Model(ParentModel{}).Where("id = ?", uid).Take(&m).Error
    if err != nil {
        return &ParentModel{}, err
    }
    if gorm.IsRecordNotFoundError(err) {
        return &ParentModel{}, errors.New("User Not Found")
    }
    return m, err
}

我改变了Post 结构,如下所示:

type Post struct {
    ParentModel
    ID        uint64    `gorm:"primary_key;auto_increment" json:"id"`
    Title     string    `gorm:"size:255;not null;unique" json:"title"`
    Content   string    `gorm:"size:255;not null;" json:"content"`
    Author    User      `json:"author"`
    AuthorID  uint32    `sql:"type:int REFERENCES users(id)" json:"author_id"`
    CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
    UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
}

我也更改了posts_controller 中的FindPostByID 方法:

func (server *Server) GetPost(w http.ResponseWriter, r *http.Request) {

    vars := mux.Vars(r)
    pid, err := strconv.ParseUint(vars["id"], 10, 64)
    if err != nil {
        responses.ERROR(w, http.StatusBadRequest, err)
        return
    }
    post := models.Post{}

    postReceived, err := post.FindByID(server.DB, pid)
    if err != nil {
        responses.ERROR(w, http.StatusInternalServerError, err)
        return
    }
    responses.JSON(w, http.StatusOK, postReceived)
}

当我运行我的程序时,出现错误:Table 'golang_rest_api.parent_models' doesn't exist

如何使用 PHP 语言这样的继承方法

【问题讨论】:

  • “如何使用 PHP 语言这样的继承方法” Go 没有继承。嵌入不会更改嵌入方法的接收者,它只是“提升”它,这允许您调用它而无需使用字段名称显式限定它。 post.FindByID 只是 post.ParentModel.FindByID 的“语法糖”。
  • golang.org/doc/faq#inheritance - 我的建议:当你在 go 中编写代码时,你需要暂停基于继承的设计思维。越早做,经历的痛苦就越少。
  • 感谢您的提前。所以我必须在每个控制器中定义方法来从相应的模型中获取数据,对吗?

标签: go go-gorm


【解决方案1】:

错误Table 'golang_rest_api.parent_models' doesn't exist 表示您的数据库中不存在名为parent_models 的表。

这是因为 gorm 默认情况下使用您在 gorm 的 Model() 方法中提供的结构的复数驼峰式名称作为其表的名称。

Gorm 为多种关联提供内置支持,您可以找到 here。我还想请您完成ParentModel 结构的定义。现在是空的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2023-01-18
    • 2017-04-22
    相关资源
    最近更新 更多