go - 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 来实现我想要做的事情?
谢谢,亚历克斯
解决方案
Where("table2.product = ?", "xxx")
无法访问第二个(预加载)表,因为它Preload
不是一个JOINS
,它是一个单独的SELECT
查询。您的代码创建两个单独的查询,如下所示:
// first query
SELECT * FROM table1 WHERE table2.product = 'xxx';
// second query
SELECT * FROM table2;
为了返回设置为特定值的所有记录,您必须执行以下操作Table1
:Product
Table2
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")
在上述查询之前添加。
推荐阅读
- java - 如何在数组中获取动态微调器选定的项目 ID?
- python - 给定一条几何车道,我如何告诉汽车遵循的路径?
- maven - 多 Maven 项目:第一个和最后一个模块在安装时显示版本
- java - 使用java检测表单中的边界框
- c# - C#:在 Linux 上的 .NET Core 中引用或使用 .so 文件
- javascript - 访问另一个数组中的数组以使用 v-for
- php - 如何在数据表子行中显示具有相应id的辅助记录?
- jquery - 为什么我的第二个下拉菜单是复制我的第一个下拉菜单的更改操作
- php - 如果我通过一个表单上传文本文件,是否可以在显示数据库中特定条目记录的其他表单上读取它?
- angular - 如何根据地图框中的值填充区域的颜色?