Gorm连接表查询

ql3eal8s  于 2023-03-16  发布在  Go
关注(0)|答案(2)|浏览(279)

我目前有一个俱乐部和标签表,我想获得所有的俱乐部,至少有一个这些给定的标签。

type Club struct {
    ID      uint
    Sets    []Tag `gorm:"many2many:club_tag;foreignKey:id;References:name"
}
type Tag struct {
    ID   uint
    Name string
}

我做了这个查询,最终返回的俱乐部,有这个特定的标签大部分时间然而,有时我遇到这些问题。

var clubs []Club
var tags  []string

db.Joins("JOIN club_tag ON club_tag.club_id=club.id).
   Joins("JOIN tag ON club_tag.tag_name=tag.name").
   Where("tag.name IN ?", tags).
   Find(&clubs)

> ERROR: column club_tag.deleted_at does not exist (SQLSTATE 42703)
> Error: missing FROM-clause entry for table "club_tag" (SQLSTATE 42P01)

我是否在此查询中遗漏了某些内容,以至于它不会返回错误?
我目前使用的是GORM v2,并尝试遵循以下示例
任何帮助都很感激!谢谢:)

mzillmmw

mzillmmw1#

基于您的错误:
错误:club_tag.deleted_at列不存在(SQLSTATE 42703)
错误:表“club_tag”缺少FROM子句条目(SQLSTATE 42P01)
你的第一个错误说你的club_tag没有deleted_at,我认为你的结构体有gorm.Model数据。
GORM定义了一个gorm.model结构,该结构包含字段IDCreatedAtUpdatedAtDeletedAt
当你创建查询的结构,其中有gorm.Model.gorm在默认情况下创建deleated_at = null的查询。所以我认为你应该删除gorm.Model和创建你想要的字段。
你的第二个错误说你的查询没有任何表连接。所以我认为你必须检查你的表名。

lyr7nygr

lyr7nygr2#

很抱歉很晚才回复,但这将有助于任何人充分寻找类似的问题。
@ttrasn我猜是正确的。
我想你用了gorm.模型到你的结构中。
GORM库,它嵌入了一些与数据库模型一起使用的公共字段。这些字段是:

ID: an auto-incrementing integer primary key
CreatedAt: a timestamp of when the record was created
UpdatedAt: a timestamp of when the record was last updated
DeletedAt: a soft delete timestamp used to mark the record as deleted instead of actually deleting it from the database.

通过将gorm.Model嵌入到自己的Go语言结构体中,就可以访问这些字段,而不必自己定义它们,从而使数据库的使用变得更加容易。
如果您使用

db.Where("key_key = ?", sKeyValue).Find(&KeyVal),

然后gorm将在引用表中搜索字段deleted_at,这将创建您要查找的原因。
但是,如果您的对象不希望搜索这些字段,您可以通过以下方式忽略这些字段

db.Unscoped().
Ex:
db.Unscoped().Where("key_key = ?", sKeyValue).Find(&KeyVal)

或者您可以使用db.Raw()sql Ex:

db.Raw("select * from master.sup_v_keyvalues where key_key= ?", sKeyValue).Scan(&KeyVal)

另外注意:如果你试图访问一个不包含上述字段的DB视图,那么只需从视图结构中删除gorm.Model。

相关问题