Go newer,从Python转过来的,目前遇到一个关于gORM的问题
如下两个情况:
1、两个表,一个表 Company(公司)、一个表Department(部门)。
2、两张表通过Many2Many相互关联的。gORM会创建一张中间表(company_department)
3、数据库情况如下:
+---------------------+
| Tables_in_warehouse |
+---------------------+
| company | <---- 公司信息表
| company_department | <---- 公司和部门的中间表
| department | <---- 部门信息表
| user |
| user_info |
+---------------------+
4、公司表中的数据如下:
+----+---------------------+---------------------+------------+-----------+-----------------+-----------------+
| id | created_at | updated_at | deleted_at | comment | company_name_zh | company_name_en |
+----+---------------------+---------------------+------------+-----------+-----------------+-----------------+
| 1 | 2022-12-03 20:59:11 | 2022-12-03 20:59:11 | NULL | 上海高新 | 上海高新 | Shanghai GaoX |
| 2 | 2022-12-03 22:25:29 | 2022-12-03 22:25:29 | NULL | gaowency2 | 上海Wanl | Wanl |
| 3 | 2022-12-04 11:52:45 | 2022-12-04 11:52:45 | NULL | gaowen2 | gaowen23 | gaowen23 |
| 4 | 2022-12-04 11:59:57 | 2022-12-04 11:59:57 | NULL | 自动化 | 自动化 | Shanghai |
+----+---------------------+---------------------+------------+-----------+-----------------+-----------------+\
5、部门表中的数据如下:
+----+---------------------+---------------------+------------+---------+--------------------+--------------------+
| id | created_at | updated_at | deleted_at | comment | department_name_zh | department_name_en |
+----+---------------------+---------------------+------------+---------+--------------------+--------------------+
| 1 | 2022-12-13 19:58:53 | 2022-12-13 19:58:53 | NULL | 开发 | 开发部2 | dev |
| 2 | 2022-12-13 22:29:12 | 2022-12-13 22:29:12 | NULL | 开发 | 开发部 | dev |
| 3 | 2022-12-13 22:34:53 | 2022-12-13 22:34:53 | NULL | 开发 | 开发部33 | dev |
+----+---------------------+---------------------+------------+---------+--------------------+--------------------+
6、company_department中间表情况如下:
+---------------+------------+
| department_id | company_id |
+---------------+------------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
+---------------+------------+
我想实现一个联表查询+模糊查询的功能
1、我通过查询 department表
2、在查询department表的时候输入一个参数,这个参数会模糊匹配department中的department_name_zh 、department_name_en 等字段,也能匹配company表中的company_name_zh 、company_name_en等字段
首先可以在 Department 表中定义一个 Many2Many 关联,用于连接 Company 表。
type Department struct {
ID int
DepartmentNameZh string
DepartmentNameEn string
Companies []*Company `gorm:"many2many:company_department;"`
}
然后可以使用 gORM 的 Preload 方法来联表查询,并使用 Where 方法进行模糊查询。
func QueryDepartments(db *gorm.DB, query string) ([]Department, error) {
var departments []Department
err := db.Preload("Companies").Where("department_name_zh LIKE ? OR department_name_en LIKE ? OR companies.company_name_zh LIKE ? OR companies.company_name_en LIKE ?", "%"+query+"%", "%"+query+"%", "%"+query+"%", "%"+query+"%").Find(&departments).Error
if err != nil {
return nil, err
}
return departments, nil
}
在调用 QueryDepartments 函数时,传入的 query 参数即为模糊查询的关键字,函数会在 department 表的 department_name_zh、department_name_en 字段和 company 表的 company_name_zh、company_name_en 字段中模糊匹配。
注意在使用 Preload 方法时,需要指定要关联查询的表名(在本例中为 "Companies")。
有关 gORM 的关联查询和模糊查询的更多信息,可以参考 gORM 官方文档:
关联查询: https://gorm.io/docs/associations.html
模糊查询: https://gorm.io/docs/query.html#Like