【问题标题】:Go GORM Preload & Select only items matching on preload table conditionGo GORM Preload & Select only items 匹配预加载表条件
【发布时间】:2020-05-22 03:14:53
【问题描述】:

我尝试使用 GORM 从父表中仅选择在相关表中具有匹配条件的项目。

type Table1 struct {
    gorm.Model
    Name string
    Email string
    Items Table2
}

type Table2 struct {
    gorm.Model
    Product string
    otherfield string
}

我想返回所有将 Table2 中的 Product 设置为特定值的 Table1 项目。到目前为止,我得到了 mssql:无法绑定多部分标识符“visits.sign_out_time”。很多。

我的命令是

var items []Table2
db.Debug().Preload("Table2").Where("table2.product = ?", "xxx").Find(&items).GetErrors()

不完全确定我哪里出错了,但无论出于何种原因 .Where() 都无法访问第二个预加载的表。我该如何使用 GORM 来实现我想要做的事情?

谢谢, 亚历克斯

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    Where("table2.product = ?", "xxx") 无法访问第二个(预加载)表,因为Preload 不是JOINS,它是一个单独的SELECT 查询。您的代码创建了两个单独的查询,如下所示:

    // first query
    SELECT * FROM table1 WHERE table2.product = 'xxx';
    // second query
    SELECT * FROM table2;
    

    为了返回所有在Table2 中将Product 设置为特定值的Table1 记录,您必须执行以下操作:

    var t1 []Table1
    err = db.
    Where(`EXISTS(SELECT 1 FROM table2 t2 WHERE t2.product = ? AND table1.id = t2.table1_id)`, productValue).
    Find(&t1).Error
    

    请注意,AND table1.id = t2.table1_id 部分只是两个表如何关联的示例,您可能有不同的关系,您需要相应地修改查询。

    如果您希望 GORM 使用 Table2 数据填充 t1.Items,请在上述查询前添加 Preload("Items")

    【讨论】:

    • 感谢@Anton - 虽然不直观,但它可以工作。不确定我是否像 EF 一样喜欢 GORM,但一旦我了解了细节,也许它会在我身上成长。
    【解决方案2】:

    如果只需要Items,可以直接在Table2上查询,无需预加载Table1

    var items []Table2
    db.Where("product = ?", "xxx").Find(&items).GetErrors()
    

    或者你需要Table1的所有数据然后加入table2然后使用where子句

    db.Debug().Joins("JOIN table2 ON table1.id = table2.table1_id")
              .Where("table2.product = ?", "xxxx").Find(&table1data)
    

    这里我在Table2 中没有看到任何用于加入的外键。你可以添加一个。

    type Table2 struct {
        gorm.Model
        Product  string
        Table1ID uint
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2018-10-11
      • 2017-04-23
      • 2018-09-15
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      相关资源
      最近更新 更多