如何在GORM中进行多表连接

4

我是一个GOlang和GORM的新手,对于如何使用GORM进行多表连接有些困惑。

例子:

表格:

Department - Fields (gorm.Modal, dep_name)
Employee - Fields (gorm.Modal, emp_id, emp_name, department_id) //employee is department table child 
EmployeeContact - Fields (gorm.Modal, employee_id, emp_contact_no)//Employee contact table is employee table child

查询

SELECT * FROM department d, employee e, employeeContact ec WHERE d.id = e.department_id and e.id = ec.employee_id

如何使用GORM制作上述查询?

db.Joins() 可以用于在 gorm 中执行联接操作。请检查它是否解决了您的问题。 - Ankit Deshpande
是的,我尝试过了,但是如何使用多个表呢?@AnkitDeshpande - Udayakumar
2个回答

5

我在这里寻找解决方案,但由于我已经自己解决了,所以我也想在这里发布它。我的查询有些不同,我只连接了2个表,但我认为这个也会起作用。

if err := db.Table("employee").Select("department.id, employee.department_id, employeeContact.employee_id").Joins("JOIN department on department.id = employee.department_id").Joins("JOIN employeeContact on employeeContact.id = employee.id").Find(&results).Error; err != nil {
    return err, ""
}

6
我们能否使用PreLoad()函数? - kiran malvi
1
预加载不会通过一个数据库查询完成执行。它会串行地访问数据库以检索关联记录。 - Joe Atzberger
@kiranmalvi 不要使用Preload,因为它使用“IN”子句检索N+1条记录。也就是说,如果原始表中的记录增加,“IN”子句将会增长。对于具有大量记录的表来说,预加载是一个可怕的想法。 - Branislav Lazic

0

您可以使用Preload,但请注意Preload并没有为此查询进行优化

首先,假设已经定义了模型:

type Department struct{
    gorm.Modal
    DepName string
    Employees *[]Employee
}

type Employee struct{
    gorm.Modal
    EmpId int
    EmpName string
    DepartmentId int
    Department Department
}

type EmployeeContact struct{
    gorm.Modal
    EmpId int
    EmpContactNo string
}

然后我们可以将此示例用于多个连接:

var department Department
db.
Model(&Department{}).
Where("DepName = ?", form.DepName).
Preload("Employees", func(tx *gorm.DB) *gorm.DB {
    return tx.Preload("Department")
}).Find(&department)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接