大家好,我是JCrazy。
在日常开发过程中,经常会有需要根据某些条件,动态决定需要联的表或查询条件的需求。
而在使用GORM框架的情况下,我们该如何优雅地处理动态联表和动态查询条件问题呢?
本文通过使用了GORM的Clauses、Scopes实践了一种较优雅的解决方案与大家分享。
方案一(不考虑):通过文本拼接SQL
具体示例可查阅:
https://www.cnblogs.com/haima/p/13335189.html
这种方法自由度很高,但也有以下两个明显的缺点:
- 有安全隐患,直接拼接SQL的方式,很容易留下SQL注入的安全隐患,影响系统安全。
- 拼接语句顺序受限,通过手动拼接SQL的方式,需考虑拼接语句的顺序,例如,JOIN语句不能直接任意放到where语句之后,而需确保在where语句之前等限制,不好灵活地实现动态调整。
方案二(推荐):使用Scopes\Clause实现动态拼接
通过查阅GORM官方文档发现了Scopes\Clause两个可用于实现动态操作的方法,但没有现成可直接用于参考的实战例子和相关详细说明,遂翻阅了下相关方法的源代码,得出如下的实践。
我们直接来举个例子。

假设有如下存储结构:
//学生信息
type Student struct {
gorm.Model
Name string
ClassName string
}
//学生家庭成员信息
type FamilyMember struct {
gorm.Model
StudentId uint
Name string
}
学生家庭成员信息(FamilyMember)跟学生信息(Student)存储在两张不同的表。
我们需要根据不同的业务条件动态决定是否需要通过学生家庭成员信息查询到对应的学生信息。
从系统性能角度考虑,若当无需通过学生家庭成员信息进行查询时,则很明显我们无需JOIN多一张表以及加多对应的查询条件,那么我们可以通过以下方式实现动态的JOIN表以及动态查询条件:
func withFilterFamilyMemberJoin() func(db *gorm.DB) *gorm.DB {

本文介绍了在GORM框架下,如何优雅地处理动态联表和查询条件。对比了通过文本拼接SQL的不安全和限制,推荐使用Scopes和Clause方法实现动态操作。通过实例展示了如何根据业务条件动态JOIN表和设置查询条件,确保系统安全并提高代码复用性。建议在遇到第三方库疑问时,阅读源码和官方文档以寻找解决方案。
最低0.47元/天 解锁文章
3746

被折叠的 条评论
为什么被折叠?



