diff --git a/generics.go b/generics.go index 43c7223a..d1d1a6e5 100644 --- a/generics.go +++ b/generics.go @@ -256,6 +256,16 @@ func (c chainG[T]) Joins(jt clause.JoinTarget, args func(db QueryInterface, join joinType = clause.LeftJoin } + if db, ok := jt.Subquery.(interface{ getInstance() *DB }); ok { + stmt := db.getInstance().Statement + if len(j.Selects) == 0 { + j.Selects = stmt.Selects + } + if len(j.Omits) == 0 { + j.Omits = stmt.Omits + } + } + expr := clause.NamedExpr{SQL: fmt.Sprintf("%s JOIN (?) AS ?", joinType), Vars: []interface{}{jt.Subquery, clause.Table{Name: j.Alias}}} if j.On != nil { diff --git a/tests/generics_test.go b/tests/generics_test.go index 1e1bf711..313b6bae 100644 --- a/tests/generics_test.go +++ b/tests/generics_test.go @@ -342,7 +342,23 @@ func TestGenericsJoinsAndPreload(t *testing.T) { if err != nil { t.Fatalf("Raw subquery join failed: %v", err) } - if result.Name != u2.Name || result.Company.Name != u.Company.Name { + if result.Name != u2.Name || result.Company.Name != u.Company.Name || result.Company.ID == 0 { + t.Fatalf("Joins expected %s, got %+v", u.Name, result) + } + + // Raw Subquery JOIN + WHERE + Select + result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB).Select("Name")).As("t"), + func(db gorm.QueryInterface, joinTable clause.Table, curTable clause.Table) gorm.QueryInterface { + if joinTable.Name != "t" { + t.Fatalf("Join table should be t, but got %v", joinTable.Name) + } + return db.Where("?.name = ?", joinTable, u.Company.Name) + }, + ).Where(map[string]any{"name": u2.Name}).First(ctx) + if err != nil { + t.Fatalf("Raw subquery join failed: %v", err) + } + if result.Name != u2.Name || result.Company.Name != u.Company.Name || result.Company.ID != 0 { t.Fatalf("Joins expected %s, got %+v", u.Name, result) }