我想处理many2many
由 GORM 自动生成的表db.AutoMigrate(&Document{}, &Folder{})
。
在这种情况下,文件夹有文档,文档有文件夹,到目前为止还不错,但是关联有状态(有效、无效...),所以我必须查看documents_folders
表格才能知道状态。
+-----------------------+
| Table |
+-----------------------+
| documents |
| documents_folders |
| folders |
+-----------------------+
Run Code Online (Sandbox Code Playgroud)
(ID primary_key == UUID)
type Stuff struct {
ID uuid.UUID `gorm:"type:char(36);primary_key;" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"update_at"`
DeletedAt *time.Time `sql:"index" json:"deleted_at"`
}
Run Code Online (Sandbox Code Playgroud)
type Folder struct {
Stuff
Name string `json:"name" form:"name" gorm:"name;"`
Documents []*Document `json:"documents" gorm:"many2many:documents_folders;"`
}
Run Code Online (Sandbox Code Playgroud)
type Document struct {
Stuff
Name string `json:"name" form:"name" gorm:"name;"`
Folders []*Folder `json:"folders" gorm:"many2many:documents_folders;"`
}
Run Code Online (Sandbox Code Playgroud)
我创建了这个模型来访问表,它是自动生成的,但我必须添加列状态
+-----------------------+
| Table |
+-----------------------+
| documents |
| documents_folders |
| folders |
+-----------------------+
Run Code Online (Sandbox Code Playgroud)
当我预加载document
和folder
喜欢时,我无法访问它:
folder := Folder{}
db.Preload("Documents").Where("id = ?", "myUUID").First(&folder)
Run Code Online (Sandbox Code Playgroud)
我想查看文档关联的状态。
谢谢你的帮助
您有以下问题:
AutoMigrate
for DocumentsFolders
。检查下面的固定示例以获取更多参考:
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"math/rand"
"time"
)
type UUID = string
type Model struct {
ID UUID `gorm:"type:char(36);primary_key;" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"update_at"`
DeletedAt *time.Time `sql:"index" json:"deleted_at"`
}
type Folder struct {
Model
Name string `json:"name" form:"name" gorm:"name;"`
Documents []Document `json:"documents" gorm:"many2many:documents_folders;"`
}
type Document struct {
Model
Name string `json:"name" form:"name" gorm:"name;"`
Folders []Folder `json:"folders" gorm:"many2many:documents_folders;"`
}
type DocumentsFolders struct {
DocumentID string `json:"document_id" sql:"type:char(36) REFERENCES documents(id)"`
Document *Document `json:"document"`
FolderID string `json:"folder_id" sql:"type:char(36) REFERENCES folders(id)"`
Folder *Folder `json:"folder"`
State string `json:"state" form:"state" gorm:"state;"`
}
var i = rand.Int()
func genId() string {
id := i
i++
return fmt.Sprintf("%036d", id)
}
func main() {
db, _ := gorm.Open("sqlite3", "./db.sqlite")
db.AutoMigrate(&Document{}, &Folder{}, &DocumentsFolders{})
folder1 := &Folder{
Model: Model{ID: genId()},
Name: "myFolder",
Documents: nil,
}
db.FirstOrCreate(&folder1, folder1.ID)
doc1 := &Document{
Model: Model{ID: genId()},
Name: "doc1",
}
db.FirstOrCreate(doc1, doc1.ID)
doc2 := &Document{
Model: Model{ID: genId()},
Name: "doc2",
}
db.FirstOrCreate(doc2, doc2.ID)
// join them
db.Create(&DocumentsFolders{
DocumentID: doc1.ID,
FolderID: folder1.ID,
State: "happy!",
})
db.Create(&DocumentsFolders{
DocumentID: doc2.ID,
FolderID: folder1.ID,
State: "happy!",
})
// get the new folder to check
db.Preload("Documents").First(folder1, folder1.ID)
// two documents are printed
fmt.Printf("Documents count: %d\n", len(folder1.Documents)) // prints 2
}
Run Code Online (Sandbox Code Playgroud)