【问题标题】:How to do a many-to-many query如何进行多对多查询
【发布时间】:2021-08-21 18:31:46
【问题描述】:

我正在尝试了解如何使用 GORM 对具有 many2many 关系的项目进行查询,但我真的迷路了。

我有以下数据库模型:

type Asset struct {
    gorm.Model
    Id             uint            `gorm:"primaryKey"`
    MachineUID     string          `gorm:"type:varchar(128)" json:"machine_uid"`
    AssetToken     string          `gorm:"uniqueIndex;type:varchar(128)"`
    CommandQueries []*CommandQuery `gorm:"many2many:command_asset;"`
}


type CommandQuery struct {
    gorm.Model
    Id      uint     `gorm:"primaryKey"`
    UUID    string   `gorm:"type:varchar(128)" json:"uuid"`
    CmdType int      `json:"cmdtype"`
    CmdArgs string   `gorm:"type:varchar(128)" json:"cmdargs"`
    Assets  *[]Asset `gorm:"many2many:command_asset;"`
    Active  bool
}

首先,我成功地尝试从令牌中检索资产,如下所示:

token := "test-token"
var result Asset
db.Where("asset_token = ?", token).First(&result)

if result.Id == 0 {
    return fmt.Errorf("Asset cannot be found in database")
}

但是从这个返回的结构中,我想检索所有 CommandQuery 对象,其中:

  • 此资产在 CommandQuery.assets 中
  • 其中 CommandQuery.active = true

我尝试了很多东西,但没有任何效果,任何帮助将不胜感激。

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    如果我理解正确,你想加载一个CommandQuery 对象的切片,这些对象应该只包含asset_token 应该等于你传递的令牌的资产。此外,仅返回具有 active=trueCommanQuery 对象。

    如果是这样的话,可以这样做:

    token := "test-token"
    var list []CommandQuery{}
    tx := db.Preload("Assets", func (gdb *gorm.DB) *gorm.DB{
               return gdb.Where("asset_token = ?", token)
             }).
             Where("active = ?", true).Find(&list)
    
    if tx.Error == nil {
        return nil, tx.Error
    }
    
    return *list, nil
    

    简而言之,custom preloading 用于将资产加载到命令查询对象中。

    【讨论】:

    • 非常感谢,这是我想做的。还有一件事:从 CommandQuery 切片中,是否可以避免直接从 gorm 查询返回“资产”字段?
    • “避免退回资产”是什么意思?
    • 当我返回 CommandQuery 切片时,我不需要用户查看为其创建此查询的所有其他切片。我可以手动清除每个结构的“资产”字段,但我想知道是否可以选择不将此字段映射到此特定查询
    • 如果您在此查询中省略了 Preload 函数,则不会填充任何资产。
    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 2014-05-18
    • 2019-03-28
    • 2021-02-10
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多