【问题标题】:computed selected field not present in response响应中不存在计算的选定字段
【发布时间】:2021-09-12 05:12:18
【问题描述】:

我在 gorm 中有这个模型,其中有 2 个字段我不希望在表中,因为它们是从 sql 查询中计算出来的:

type User struct {
    ID          uint        `json:"id" gorm:"primarykey,autoIncrement"`
    MutedUsers     []*User `json:"-" gorm:"many2many:user_muted_users;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`
    BlockedUsers   []*User `json:"-" gorm:"many2many:user_blocked_users;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`
    ...

    IsMuted     bool `json:"is_muted" gorm:"-"`
    IsBlocked   bool `json:"is_blocked" gorm:"-"`
}

计算上述字段的查询:

var users []models.User

userMutedQ := database.Instance.
    Table("user_muted_users").
    Select("1").
    Where("user_id = ? and muted_user_id = u.id", 1)

userBlockedQ := database.Instance.
    Table("user_blocked_users").
    Select("1").
    Where("user_id = ? and blocked_user_id = u.id", 1)

database.Instance.
    Table("users u").
    Select("u.*, "+
        "(case when exists(?) then 'true' else 'false' end) as is_muted, "+
        "(case when exists(?) then 'true' else 'false' end) as is_blocked, ",
        userMutedQ, userBlockedQ, 
    ).
    Where("u.id = 1").
    Scan(&users)

当对数据库运行时,来自控制台的 sql 将生成具有正确值的列 is_muted is_blocked(一些 true 一些 false)。

但是,users 列表将 is_muted is_blocked 的所有值设置为 false。由于- 标志定义,gorm 可能会忽略它们。如果我不使用-,那么gorm 将在我的数据库中创建is_muted is_blocked 列,这些列是完全多余的,因为总是计算值。

这里的正确方法是什么?

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    根据 docs (Declaring Models/Field-Level Permission) 和 新功能 (Add field tag to ignore migrationPR),您可以使用 migration 指令为 - 标签在migration 期间忽略字段创建并使用->只读 字段权限:

    IsBlocked bool `gorm:"->;-:migration"`
    

    【讨论】:

    • Solid,发帖前我自己做了研究,但我没有找到那个信息。
    • 糟糕的是,gorm 会在每次读取该表时尝试填充这些字段,这将失败ERROR: column users.is_muted does not exist
    • @RomeoMihalcea - 我尝试使用Find/Select/Firstgorm:"->;-:migration" 标签?? 工作正常...添加您的代码sn-p
    • 你提到Find/Select/First 的事实让我思考,所以我用工具看了一下,我使用的是Scan,不要问我为什么——也许是因为尝试了太多错误的事情。没有扫描 (Find) 可以正常工作。谢谢。
    • 但是当表格作为与usersAssoc := database.Instance.Model(chat).Association("Users") 之类的关系被拉出时它不起作用。调用将使 gorm 说表用户上不存在字段 is_blocked。我从模型中提取了这些字段,并用它们创建了一个新结构,并从用户模型中继承。找不到更优雅的方式 atm。
    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多