INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN这四个怎么在gorm中使用

发布于:2025-02-11 ⋅ 阅读:(49) ⋅ 点赞:(0)

在 GORM 中,JOIN 操作是通过 Joins 方法实现的,而不同类型的 JOIN(如 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN)可以通过特定的 SQL 语法来表示。GORM 本身并没有直接的 INNER, LEFT, RIGHT 等专用方法,但可以通过使用 Joins 和 SQL 来实现这几种 JOIN 操作。

1. INNER JOIN
INNER JOIN 是默认的 JOIN 类型,因此在 GORM 中,只需要使用 Joins 方法即可。

示例:
假设你有两张表 users 和 orders,我们想要获取所有有订单的用户:

db.Joins("JOIN orders ON orders.user_id = users.id").Find(&users)

解释:这是一个典型的 INNER JOIN,只返回 users 和 orders 中匹配的记录。

2. LEFT JOIN
要执行 LEFT JOIN,可以在 Joins 中明确指定 LEFT JOIN 语句。

示例:
假设你想要查找所有用户,即使他们没有订单(未匹配的订单记录用 NULL 填充):

db.Joins("LEFT JOIN orders ON orders.user_id = users.id").Find(&users)

解释:LEFT JOIN 返回 users 表中的所有记录,即使 orders 表中没有匹配的 user_id。

3. RIGHT JOIN
虽然 RIGHT JOIN 较为少用,但如果需要的话,也可以通过指定 RIGHT JOIN 的 SQL 实现。

示例:
假设你想要查找所有订单,即使某些订单没有对应的用户:

db.Joins("RIGHT JOIN orders ON orders.user_id = users.id").Find(&orders)

解释:RIGHT JOIN 返回 orders 表中的所有记录,即使 users 表中没有匹配的 id,未匹配的用户信息用 NULL 填充。

4. FULL JOIN
GORM 不直接支持 FULL JOIN,因为它依赖于底层数据库的支持。通常可以通过两次 LEFT JOIN 和 RIGHT JOIN 并用 UNION 合并来实现。不过,许多数据库(例如 MySQL)并不支持 FULL JOIN,如果你使用 PostgreSQL 或其他支持 FULL JOIN 的数据库,可以直接使用 SQL:

示例:

db.Raw(`
    SELECT users.*, orders.*
    FROM users
    FULL JOIN orders ON orders.user_id = users.id
`).Scan(&results)

解释:Raw 允许你直接执行原始 SQL 查询,因此可以通过 FULL JOIN 语法来获取所有用户和订单,包括未匹配的记录。

5. 自定义查询中的 Select
你可以通过 Select 方法结合 JOIN 来选择特定的字段,避免返回不必要的数据。

示例:

db.Table("users").Select("users.name, orders.item").
    Joins("LEFT JOIN orders ON orders.user_id = users.id").
    Find(&results)

解释:返回 users 表中的 name 和 orders 表中的 item 字段,即使某些用户没有订单。

总结
在 GORM 中,JOIN 类型主要通过 SQL 语法指定:

  • INNER JOIN:默认使用 Joins(“JOIN …”)。
  • LEFT JOIN:使用 Joins(“LEFT JOIN …”)。
  • RIGHT JOIN:使用 Joins(“RIGHT JOIN …”)。
  • FULL JOIN:通过 Raw 方法执行原生 SQL。
    你可以根据需求选择合适的 JOIN 类型来构建查询。

网站公告

今日签到

点亮在社区的每一天
去签到