登录
首页 >  Golang >  Go问答

如何在 Gorm 中建立连接?

来源:stackoverflow

时间:2024-03-24 20:06:41 212浏览 收藏

在 Gorm 中建立连接涉及使用 `Joins` 方法,该方法指定连接的表和连接条件。连接表后,可以在连接之后的 `Where` 语句中使用它们。使用 `Select` 方法指定要选择的列,而 `Find` 方法用于检索结果。通过避免调用多个 `table` 方法并直接在连接之后使用 `Where` 语句,可以解决查询从错误表开始的问题。

问题内容

我想编写一个查询,例如

select table_a.*, table_c.* 
from table_a 
  left join table_b on table_a.id = table_b.table_a_id
  left join table_c on table_b.id = table_c.table_b_id
where table_a.column_a = 'a_value',
  and table_c.column_b = 'some_value'
  and table_c.column_c = 'another_value';

编辑:我错过了非常重要的一点,where 子句变量不固定。根据输入,每个表可能使用更多或更少的列。

目前,我的查询如下

db.table("table_a").
    joins("left join table_b on table_a.id = table_b.table_a_id").
    joins("left join table_c on table_b.id = table_c.table_b_id").
    select("table_a.*, table_c.*").
    table("table_a").where(map[string]interface{}{"column_a": "value"}).
    table("table_c").where(map[string]interface{}{
        "column_b": "some_value", 
        "column_c": "another_value",
    }).
    find(&elem)

但是,记录的 sql 语句是

SELECT table_a.*, table_c.* 
FROM `table_c` # gorm gives the wrong starting table, should be table_a
  LEFT JOIN table_b ON table_a.id = table_b.table_a_id 
  LEFT JOIN table_c ON table_b.id = table_c.table_b_id 
WHERE (`table_c`.`column_a` = 'value') # wrong table again
  AND (`table_c`.`column_b` = 'some_value') 
  AND (`table_c`.`column_c` = 'another_value')

我不确定这里出了什么问题。使用此语法是否无法同时查询不同的表?我宁愿尽可能避免使用原始查询。

更新:我尝试过动态生成 sql where 子句,但更喜欢 gorm 提供的更直接的方法。


解决方案


您不需要调用这么多 table 方法。它使用您调用的最后一个来构建 sql 查询。

相反,一旦连接了表,您就可以在连接之后的 where 语句中使用它们。

试试这个:

db.Table("table_a").
    Joins("left join table_b on table_a.id = table_b.table_a_id").
    Joins("left join table_c on table_b.id = table_c.table_b_id").
    Select("table_a.*, table_c.*").
    Where("table_a.column_a = ?", "value").
    Where("table_c.column_b = ? AND table_c.column_c = ?", "some_value",  "another_value").
    Find(&elem)

以上就是《如何在 Gorm 中建立连接?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>