前言
本文中使用到的数据表结构以及GORM版本的区分详见以下文章:GORM v2 一对一关联查询使用(Belongs To 、Has One)
执行区别
调用gorm的Debug方法打印一下一对一关联时SQL语句执行过程。
Preload执行过程
执行代码
db.Debug().Preload("Info").First(&student)
执行结果
从图中可以看出,gorm执行了两条SQL来获取主副表数据
SELECT * FROM `students` ORDER BY `students`.`id` LIMIT 1 SELECT * FROM `information` WHERE `information`.`student_id` = 1
Joins执行过程
执行代码
db.Debug().Joins("Info").First(&student)
执行结果
从图中可以看出,使用Joins后,只执行一条SQL语句就获得了结果
SELECT `students`.`id`,`students`.`name`,`Info`.`id` AS `Info__id`,`Info`.`student_id` AS `Info__student_id`,`Info`.`sex` AS `Info__sex`,`Info`.`age` AS `Info__age`,`Info`.`hometown` AS `Info__hometown` FROM `students` LEFT JOIN `information` `Info` ON `students`.`id` = `Info`.`student_id` WHERE `students`.`id` = 1 ORDER BY `students`.`id` LIMIT 1
结果
两种预加载的差别:
- Preload会分开多条SQL语句来执行获取结果
- Joins会使用left join一条SQL语句直接获取到结果
- 另外,需要注意的是:Joins只能用于一对一关联中,即HasOne和BelongTo关联