2 回答

TA貢獻1780條經驗 獲得超5個贊
Where("table2.product = ?", "xxx")無法訪問第二個(預加載)表,因為它Preload不是一個JOINS,它是一個單獨的SELECT查詢。您的代碼創建兩個單獨的查詢,如下所示:
// first query
SELECT * FROM table1 WHERE table2.product = 'xxx';
// second query
SELECT * FROM table2;
為了返回設置為特定值的所有記錄,您必須執行以下操作Table1:ProductTable2
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")在上述查詢之前添加。

TA貢獻1878條經驗 獲得超4個贊
如果只需要Items,可以直接查詢,Table2無需預加載Table1
var items []Table2
db.Where("product = ?", "xxx").Find(&items).GetErrors()
或者您需要Table1then Join 的所有數據,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
}
- 2 回答
- 0 關注
- 611 瀏覽
添加回答
舉報