登录
首页 >  Golang >  Go问答

执行复杂的多对多检索

来源:stackoverflow

时间:2024-02-18 19:12:24 150浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《执行复杂的多对多检索》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我试图了解如何使用 gorm 对具有多对多关系的项目进行查询,但我真的迷失了。

我有以下数据库模型:

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

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


正确答案


如果我理解正确,您想要加载 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用于将资产加载到命令查询对象中。

以上就是《执行复杂的多对多检索》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>