Gorm查询自定义加入额外列



我正试图从Gorm上的多对多关系中获得额外的列。示例

type Part struct {
Id unit
Name string
}
  • type Diagram struct {
    Id unit
    Name string
    Parts []Part `gorm:"many2many:diagram_parts;"`
    }
    
  • DiagramPart
  • type DiagramPart struct{
    DiagramId         uint `gorm:"primaryKey"`
    PartId            uint `gorm:"primaryKey"`
    PartDiagramNumber int
    PartNumber        string
    PartDescription   string
    }
    

    这就是我在Parts中检索PartNumber和PartDescription所做的。

    diagram := &Diagram{}
    db := s.db.Where("id = ?", 1).
    Preload("Parts", func(db *gorm.DB) *gorm.DB {
    return db.Select("parts.*, diagram_parts.part_number, diagram_parts.part_description").
    Joins("left join diagram_parts on diagram_parts.part_id = parts.id")
    }).
    First(diagram)
    

    不幸的是,我无法检索part_number, part_description。我该怎么做呢?

    可以在structPartOR上添加字段PartNumberPartDescriptionDiagram,然后在这些字段上添加标签gorm:"-:migration;->"以忽略迁移并进入只读模式。但是根据您的情况,您可以将它添加到structPart中,因为您已经预加载了它。

    来源:https://gorm.io/docs/models.html Field-Level-Permission

    示例如下:

    package main
    import (
    "fmt"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    )
    type Part struct {
    Id              uint `gorm:"primaryKey"`
    Name            string
    PartNumber      string `gorm:"-:migration;->"`
    PartDescription string `gorm:"-:migration;->"`
    }
    type Diagram struct {
    Id              uint `gorm:"primaryKey"`
    Name            string
    Parts           []Part `gorm:"many2many:diagram_parts;"`
    // PartNumber      string `gorm:"-:migration;->"`
    // PartDescription string `gorm:"-:migration;->"`
    }
    type DiagramPart struct {
    DiagramId         uint `gorm:"primaryKey"`
    PartId            uint `gorm:"primaryKey"`
    PartDiagramNumber int
    PartNumber        string
    PartDescription   string
    }
    func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
    panic("failed to connect database")
    }
    db.AutoMigrate(&Diagram{}, &Part{}, &DiagramPart{})
    diagram := &Diagram{}
    err = db.Debug().Where("id = ?", 1).
    // Select("diagrams.*, diagram_parts.part_number, diagram_parts.part_description").
    Preload("Parts", func(db *gorm.DB) *gorm.DB {
    return db.Select("parts.*, diagram_parts.part_number, diagram_parts.part_description").
    Joins("left join diagram_parts on diagram_parts.part_id = parts.id")
    }).
    // Joins("left join diagram_parts on diagram_parts.diagram_id = diagrams.id").
    First(diagram).Error
    if err != nil {
    panic(err)
    }
    fmt.Printf("diagram: %vn", diagram)
    fmt.Println("part number:", diagram.Parts[0].PartNumber)
    }
    

    相关内容

    • 没有找到相关文章

    最新更新