为了账号安全,请及时绑定邮箱和手机立即绑定

Golang Gorm:构造不同的相同查询会抛出不同的结果

Golang Gorm:构造不同的相同查询会抛出不同的结果

Go
海绵宝宝撒 2022-12-19 19:25:28
我想运行以下查询:SELECT *FROM artistsWHERE name LIKE '%roll%';该WHERE子句将是动态的,这意味着我将遍历映射以构建它并将其链接到主查询。话虽如此,在尝试迭代之前,我考虑过测试方法链(我是 Gorm 的新手)所以我运行了:var artist entities.Artistquery := as.db.Model(&artist)query.Where("name LIKE ?", "%roll%")if err := query.Find(&as.Artists).Error; err != nil {    return err}如您所见,我链接了查询的不同部分并使用Find. 这将返回表中的所有元素。打印出执行的查询后,我得到:SELECT * FROM `artists`  WHERE `artists`.`deleted_at` IS NULL没有提到该LIKE条款,此外,我不知道从哪里来deleted_at IS NULL。尽管目前这并不重要,因为最终我也会将其添加到查询中。但是如果我跑:var artist entities.Artistquery := as.db.Model(&artist)if err := query.Where("name LIKE ?", "%roll%").Find(&as.Artists).Error; err != nil {    return err}我得到了我期待的结果。执行的查询是:SELECT * FROM `artists`  WHERE `artists`.`deleted_at` IS NULL AND ((name LIKE '%roll%')) 知道发生了什么事吗?
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

我不知道deleted_at IS NULL从哪里来


您可能正在扩展您的模型,gorm.Model其中包含DeleteAt导致deleted_at IS NULL被添加到查询中的字段。DeleteAt用于检查记录是否被删除,然后不将其包含在结果中


没有提到 LIKE 子句


var artist entities.Artist


query := as.db.Model(&artist)


query.Where("name LIKE ?", "%roll%") <- will return new query

if err := query.Find(&as.Artists).Error; err != nil {

    return err

}

正如 Bill 指出的那样Where,返回具有修改条件的新查询,但是由于您没有为其分配任何内容,因此不会将其添加到查询中


var artist entities.Artist


query := as.db.Model(&artist)


if err := query.Where("name LIKE ?", "%roll%").Find(&as.Artists).Error; err != nil {

    return err

}

在这里,您使用Find的是新返回的查询,其中包含条件,因此它按预期工作。


要在查询中链接多个 where 条件,您可以通过多种方式实现:


1:


var artist entities.Artist


query := as.db.Model(&artist)


query = query.Where("name LIKE ?", "%roll%")


if err := query.Find(&as.Artists).Error; err != nil {

    return err

}

2:


var artist entities.Artist


query := as.db.Model(&artist)


err := query.

          Where("name LIKE ?", "%roll%").

          Where("name LIKE ?", "%m%").

          Find(&as.Artists).

          Error

if err != nil {

    return err

}


查看完整回答
反对 回复 2022-12-19
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

query.Where()文档(https://gorm.io/docs/query.html )中使用的所有示例都显示了链接,就像您的第二个示例一样。

我的结论是Where()不修改实例的 SQL query,它返回一个包含条件的新查询实例。


查看完整回答
反对 回复 2022-12-19
  • 2 回答
  • 0 关注
  • 431 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信