【发布时间】: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 列,这些列是完全多余的,因为总是计算值。
这里的正确方法是什么?
【问题讨论】: