gORM学习过程中有些疑问,技术请教

问题遇到的现象和发生背景

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