【问题标题】:How to chain joins in gorm?如何在gorm中链接连接?
【发布时间】:2021-05-06 15:41:28
【问题描述】:

我想写一个类似的查询

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 提供的更直接的方法,我会更喜欢。

【问题讨论】:

    标签: mysql sql go orm go-gorm


    【解决方案1】:

    您不需要调用这么多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)
    

    【讨论】:

    • 对不起,错过了 where 子句不固定的事实,这就是我使用地图的原因。有没有办法强制带有接口参数的 where 使用特定的表?
    • 如果TableA模型对应于您的table_a DB表,您可以尝试将Where方法更改为.Where(&TableA{ColumnA: "value"}).Where(&TableB{ColumnB: "some_value"}).Where(&TableC{ColumnC: "another_value"})。我相信Joins 方法仍然需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2022-01-12
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多