添加from 可以实现子查询
This commit is contained in:
parent
0bc93850ed
commit
f885b5c8f0
|
@ -2,6 +2,7 @@ package model
|
||||||
|
|
||||||
type QueryCondition struct {
|
type QueryCondition struct {
|
||||||
where ParseWhere
|
where ParseWhere
|
||||||
|
from string
|
||||||
fields string
|
fields string
|
||||||
group string
|
group string
|
||||||
order SqlBuilder
|
order SqlBuilder
|
||||||
|
@ -37,6 +38,12 @@ func Fields(fields string) Condition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func From(from string) Condition {
|
||||||
|
return func(c *QueryCondition) {
|
||||||
|
c.from = from
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Group(group string) Condition {
|
func Group(group string) Condition {
|
||||||
return func(c *QueryCondition) {
|
return func(c *QueryCondition) {
|
||||||
c.group = group
|
c.group = group
|
||||||
|
|
|
@ -247,14 +247,17 @@ func BuildQuerySql[T Model](q *QueryCondition) (r string, args []any, err error)
|
||||||
}
|
}
|
||||||
tp := "select %s from %s %s %s %s %s %s %s"
|
tp := "select %s from %s %s %s %s %s %s %s"
|
||||||
l := ""
|
l := ""
|
||||||
|
table := rr.Table()
|
||||||
|
if q.from != "" {
|
||||||
|
table = q.from
|
||||||
|
}
|
||||||
if q.limit > 0 {
|
if q.limit > 0 {
|
||||||
l = fmt.Sprintf(" limit %d", q.limit)
|
l = fmt.Sprintf(" limit %d", q.limit)
|
||||||
}
|
}
|
||||||
if q.offset > 0 {
|
if q.offset > 0 {
|
||||||
l = fmt.Sprintf(" %s offset %d", l, q.offset)
|
l = fmt.Sprintf(" %s offset %d", l, q.offset)
|
||||||
}
|
}
|
||||||
r = fmt.Sprintf(tp, q.fields, rr.Table(), j, w, groupBy, h, q.order.parseOrderBy(), l)
|
r = fmt.Sprintf(tp, q.fields, table, j, w, groupBy, h, q.order.parseOrderBy(), l)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -569,3 +569,67 @@ func Test_gets(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_finds(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
db dbQuery
|
||||||
|
ctx context.Context
|
||||||
|
q *QueryCondition
|
||||||
|
}
|
||||||
|
type testCase[T Model] struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
wantR []T
|
||||||
|
wantErr bool
|
||||||
|
}
|
||||||
|
var u user
|
||||||
|
tests := []testCase[options]{
|
||||||
|
{
|
||||||
|
name: "sub query",
|
||||||
|
args: args{db: glob, ctx: ctx, q: Conditions(
|
||||||
|
From("(select * from wp_options where option_id <100) a"),
|
||||||
|
Where(SqlBuilder{{"option_id", ">", "50", "int"}}),
|
||||||
|
)},
|
||||||
|
wantR: func() []options {
|
||||||
|
r, err := Select[options](ctx, "select * from (select * from wp_options where option_id <100) a where option_id>50")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}(),
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "mixed query",
|
||||||
|
args: args{db: glob, ctx: ctx, q: Conditions(
|
||||||
|
From("(select * from wp_options where option_id <100) a"),
|
||||||
|
Where(SqlBuilder{
|
||||||
|
{"u.ID", "<", "50", "int"}}),
|
||||||
|
Join(SqlBuilder{
|
||||||
|
{"left join", user.Table(u) + " u", "a.option_id=u.ID"},
|
||||||
|
}),
|
||||||
|
Fields("u.user_login autoload,option_name,option_value"),
|
||||||
|
)},
|
||||||
|
wantR: func() []options {
|
||||||
|
r, err := Select[options](ctx, "select u.user_login autoload,option_name,option_value from (select * from wp_options where option_id <100) a left join wp_users u on a.option_id=u.ID where `u`.`ID`<50")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}(),
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
gotR, err := finds[options](tt.args.db, tt.args.ctx, tt.args.q)
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("finds() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(gotR, tt.wantR) {
|
||||||
|
t.Errorf("finds() gotR = %v, want %v", gotR, tt.wantR)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user