GORM 通过关联表查主表
在 GORM 中,通过关联表查找主表可以使用 Preload 函数。假设有两个表,一个是订单表 Orders,另一个是用户表 Users,它们之间通过 user_id 字段建立了关联。现在需要查询所有订单,并且将每个订单对应的用户信息也一并查询出来,可以使用以下代码:
db.Preload("User").Find(&orders)
其中,"User" 是指订单表 Orders 中定义的关联字段名称,它表示要查询的关联表是用户表 Users这样查询出来的 orders 数组中的每个元素都会包含对应的用户信息。
GORM join关联查询
以下是使用GORM进行join关联查询的示例代码:
type Service struct {
ServiceID int
ServiceName string
SystemID int
System System
}
type System struct {
SystemID int
SystemName string
}
var services []Service
db.Table("go_service_info").Select("go_service_info.service_id, go_service_info.service_name, go_system_info.system_id, go_system_info.system_name").Joins("left join go_system_info on go_service_info.system_id = go_system_info.system_id").Scan(&services)
在这个示例中,我们定义了两个结构体:Service和System。Service结构体包含了ServiceID、ServiceName、SystemID和System四个字段,其中System字段是一个System结构体类型。System结构体包含了SystemID和SystemName两个字段。
我们使用db.Table()方法指定要查询的表名,然后使用Select()方法指定要查询的字段。在这个例子中,我们查询了go_service_info表中的service_id和service_name字段,以及go_system_info表中的system_id和system_name字段。
接下来,我们使用Joins()方法指定要进行关联查询的表和关联条件。在这个例子中,我们使用了left join关键字,将go_service_info表和go_system_info表进行了关联,关联条件是go_service_info表的system_id字段等于go_system_info表的system_id字段。
最后,我们使用Scan()方法将查询结果保存到services变量中。
GORM 没有关联关系的多表联查
在 GORM 中进行多表联查时,需要使用 Preload 或 Joins 方法来实现。Preload 方法会自动加载关联表的数据,而 Joins 方法则是通过 SQL 的 JOIN 操作来实现联查。
例如,假设我们有两个表 User 和 Order,它们之间的关系是一个用户可以有多个订单。我们可以使用 Preload 方法来查询某个用户及其所有订单的信息:
var user User
db.Preload("Orders").Find(&user)
这样会先查询出用户信息,再自动查询出该用户的所有订单信息。
如果要使用 Joins 方法进行联查,可以这样写:
var user User
var orders []Order
db.Joins("LEFT JOIN orders ON orders.user_id = users.id").Where("users.id = ?", userID).Find(&user).Find(&orders)
这样会执行一条 SQL 语句,查询出指定用户及其所有订单的信息。注意,这里使用了 LEFT JOIN 左连接,以便查询出所有订单信息,即使该用户没有任何订单。
相关推荐
















