Go GORM预加载并仅选择在预加载表条件下匹配的项目

问题描述 投票:0回答:2

我正在尝试使用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 gorm go-gorm
2个回答
0
投票

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

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

或者您需要Table1的所有数据,然后与table2联接然后使用条件

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
}

0
投票

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

如果要GORM用t1.Items数据填充Table2,则将Preload("Items")放在上述查询之前。

© www.soinside.com 2019 - 2024. All rights reserved.