go语言的gin框架+mysql做web开发,模型之间的关联问题

go语言的gin框架+mysql做web开发,模型之间的关联问题,下面有个示例:

package model

import "time"

// Article 文章
type Article struct {
    ID            uint       `gorm:"primary_key" json:"id"`
    CreatedAt     time.Time  `json:"createdAt"`
    UpdatedAt     time.Time  `json:"updatedAt"`
    DeletedAt     *time.Time `sql:"index" json:"deletedAt"`
    Name          string     `json:"name"`
    BrowseCount   uint       `json:"browseCount"`
    CommentCount  uint       `json:"commentCount"`
    CollectCount  uint       `json:"collectCount"`
    Status        int        `json:"status"`
    Content       string     `json:"content"`
    HTMLContent   string     `json:"htmlContent"`
    ContentType   int        `json:"contentType"`
    Categories    []Category `gorm:"many2many:article_category;ForeignKey:ID;AssociationForeignKey:ID" json:"categories"`
    Comments      []Comment  `gorm:"ForeignKey:SourceID" json:"comments"`
    UserID        uint       `json:"userID"`
    User          User       `json:"user"`
    LastUserID    uint       `json:"lastUserID"` //最后一个回复文章的人
    LastUser      User       `json:"lastUser"`
    LastCommentAt *time.Time `json:"lastCommentAt"`
}

问题:
1、User和Article是一对多的关系,不太明白上面的代码为什么要把UserUserID都写上,只写UserID不就行了吗?
2、这里写上User,意思是articles表有一个user字段来保存这个user的信息?

补充:
建表的sql代码又没有写user字段,那上面Article结构体为什么要写上User?

clipboard.png

阅读 5k
3 个回答

@cherrylee 贴出来的代码是service & model 混合的数据结构。你想要的应该是这样的吧?

// service.go
type ArticleService struct {
    ID      int64        `json:"id"`
    User    UserService  `json:"user"`
    //...
}

type UserService struct {
    ID int64 `json:"id"`
    //...
}
// model.go
type ArticleModel struct {
    ID     int64  `gorm:"primary_key"`
    UserID int64  `gorm:"column:user_id"`
}

type UserModel struct {
    ID int64 `gorm:"primary_key"`
    // ...
}

我个人推荐解耦合的写法,之间可以通过一个load函数来转换model到service解构。为此我还写了一个工具来完成这部分工作。。。
yeqown.github.io/Golang适用的DTO工具,希望对你有帮助。

多看看gorm的文档,User的作用是可以在查询Article的时候用Preload或者Related,把相关的数据关联进去

可能是为了做缓存,适当的冗余避免每次关联查询;
也可能这里对外输出json要求带上User内容,这里结构体填充USer后可以直接marshal转json

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题