首页 > 解决方案 > Go GORM Preload & Select only items 匹配预加载表条件

问题描述

我试图使用 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 来实现我想要做的事情?

谢谢,亚历克斯

标签: gogo-gorm

解决方案


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

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

为了返回设置为特定值的所有记录,您必须执行以下操作Table1ProductTable2

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部分只是两个表如何相关的示例,您可能有不同的关系,您需要相应地修改查询。

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


推荐阅读