使用gorm golang在多个表中进行动态列搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用gorm golang在多个表中进行动态列搜索相关的知识,希望对你有一定的参考价值。

我的方案是我有一个带搜索选项的网格,用户可以选择列并进行搜索,网格数据来自各种表格。我附上了一个网格示例屏幕。

User Screen

所以我正在尝试为搜索创建动态查询,但问题是我只能在主表(schema.Robot)中搜索而不能在Preload表中搜索。每当我试图从Preload表中搜索数据数据时,请从RobotModel表中说明时间低于错误

pq:缺少表“robot_models”的FROM子句条目

这是我的代码

func (r *RobotsRepository) GetRobotsSummary(listParams viewmodel.ListParams, companyID uint) ([]*schema.Robot, int, error) {
mrobots := []*schema.Robot{}
var count int
var order string
if listParams.SortColumn == "" {
    listParams.SortColumn = "id"
    listParams.SortOrder = 1
} else {
    listParams.SortColumn = util.Underscore(listParams.SortColumn)
}
if listParams.SortOrder == 0 {
    order = "ASC"
} else {
    order = "DESC"
}

var searchQuery string
if listParams.SearchText != "" {
    switch listParams.SearchColumn {
    case "Robot":
        listParams.SearchColumn = "name"
    case "Model":
        listParams.SearchColumn = "robot_models.name"
    }
    searchQuery = listParams.SearchColumn +" LIKE '%"+ listParams.SearchText +"%' and Company_ID = " + fmt.Sprint(companyID)
}else{
    searchQuery = "Company_ID = " + fmt.Sprint(companyID)
}   

orderBy := fmt.Sprintf("%s %s", listParams.SortColumn, order)

err := r.Conn.
    Preload("RobotModel", func(db *gorm.DB) *gorm.DB {
        return db.Select("ID,Name")
    }).
    Preload("Task", func(db *gorm.DB) *gorm.DB {
        return db.Where("Task_Status in ('In-Progress','Pending')").Select("ID, Task_Status")
    }).
    Preload("CreatedUser", func(db *gorm.DB) *gorm.DB {
        return db.Select("ID,Display_Name")
    }).
    Preload("UpdatedUser", func(db *gorm.DB) *gorm.DB {
        return db.Select("ID,Display_Name")
    }).
    Where(searchQuery).
    Order(orderBy).
    Offset(listParams.PageSize * (listParams.PageNo - 1)).
    Limit(listParams.PageSize).
    Find(&mrobots).Error

r.Conn.Model(&schema.Robot{}).Where(searchQuery).Count(&count)

return mrobots, count, err 
}

在searchQuery变量中,我存储了我的动态查询。我的问题是如何搜索预载表列的数据

这是我正在尝试使用gorm实现的sql查询

SELECT robots.id,robots.name,robot_models.name as 
model_name,count(tasks.task_status) as task_on_hand,
robots.updated_at,users.user_name as updated_by
FROM rfm.robots as robots
left join rfm.tasks as tasks on tasks.robot_id = robots.id and 
tasks.task_status in ('In-Progress','Pending') 
left join rfm.robot_models as robot_models on robot_models.id = 
robots.robot_model_id 
left join rfm.users as users on users.id = robots.updated_by 
WHERE robot_models.name::varchar like '%RNR%' and robots.deleted_at is null 
GROUP BY robots.id,robot_models.name,users.user_name 
ORDER BY task_on_hand DESC LIMIT 2 OFFSET 0

抱歉英语不好!

答案

即使您正在预加载,在过滤和排序其他表上的列时,仍然需要显式使用连接。预加载用于急切地加载数据以映射到模型中,而不是连接表。

链接在这样的事情上:

.Joins("LEFT JOIN rfm.robot_models AS robot_models ON robot_models.id = robots.robot_model_id")

如果您可以使用此技术使用AS关键字,我不肯定,但如果不能,则应该很容易相应地调整您的查询。

以上是关于使用gorm golang在多个表中进行动态列搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用 golang-migrate/migrate 进行 Gorm 迁移

golang go-sql-driver gorm 数据库报错 bad connection

使用gorm的postgres中的“$ 1”或附近的golang语法错误

知识分享之Golang——使用gorm时进行执行自定义SQL的几种方式

您如何在 Google 表格中进行动态/依赖下拉菜单?

如何在红移中进行动态正则表达式匹配?