首页 > 解决方案 > 响应中不存在计算的选定字段

问题描述

我有这个模型,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(some truesome false)。

然而,该users列表的所有值都为is_muted is_blockedfalse。gorm由于-标志定义,可能会忽略它们。如果我不使用-thengormis_muted is_blocked在我的数据库中创建完全冗余的列,因为总是计算值。

这里的正确方法是什么?

标签: gogo-gorm

解决方案


根据文档Declaring Models/Field-Level Permission)和新功能添加字段标签以忽略迁移PR),您可以使用migration指令标签忽略迁移期间的-字段创建并使用只读字段权限:->

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

推荐阅读