mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
## What this PR does Revert the auto table prefix behavior in `Order()` and `Group()` introduced by #4521. ## Why PR #4521 attempted to resolve column ambiguity in GROUP BY/ORDER BY with MySQL JOIN by automatically adding table prefixes to unqualified columns. However, this approach has issues: 1. When using `.As()` to set table alias, it uses the original table name instead of the alias, causing errors in PostgreSQL and other databases 2. The framework cannot reliably determine which table the user intends when multiple tables have the same column 3. Adds hidden behavior that users may not expect ## Example of the issue (#4554) ```go db.Model("demo_a").As("a"). LeftJoin("demo_b", "b", "a.id=b.data_id"). Order("sort").All() Expected (v2.9.5): ORDER BY "sort" Actual (v2.9.6): ORDER BY "demo_a".sort -- Wrong! Should use alias "a" or no prefix Solution Revert to v2.9.5 behavior: Order("sort") generates ORDER BY "sort" without auto-prefixing. Users should explicitly specify table prefix when needed: Order("a.sort"). Closes #4554 ``` --------- Co-authored-by: hailaz <739476267@qq.com>
96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
package gdb
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
)
|
|
|
|
// Order sets the "ORDER BY" statement for the model.
|
|
//
|
|
// Example:
|
|
// Order("id desc")
|
|
// Order("id", "desc")
|
|
// Order("id desc,name asc")
|
|
// Order("id desc", "name asc")
|
|
// Order("id desc").Order("name asc")
|
|
// Order(gdb.Raw("field(id, 3,1,2)")).
|
|
func (m *Model) Order(orderBy ...any) *Model {
|
|
if len(orderBy) == 0 {
|
|
return m
|
|
}
|
|
var (
|
|
core = m.db.GetCore()
|
|
model = m.getModel()
|
|
)
|
|
for _, v := range orderBy {
|
|
if model.orderBy != "" {
|
|
model.orderBy += ","
|
|
}
|
|
switch v.(type) {
|
|
case Raw, *Raw:
|
|
model.orderBy += gconv.String(v)
|
|
default:
|
|
orderByStr := gconv.String(v)
|
|
if gstr.Contains(orderByStr, " ") {
|
|
model.orderBy += core.QuoteString(orderByStr)
|
|
} else {
|
|
if gstr.Equal(orderByStr, "ASC") || gstr.Equal(orderByStr, "DESC") {
|
|
model.orderBy = gstr.TrimRight(model.orderBy, ",")
|
|
model.orderBy += " " + orderByStr
|
|
} else {
|
|
model.orderBy += core.QuoteWord(orderByStr)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return model
|
|
}
|
|
|
|
// OrderAsc sets the "ORDER BY xxx ASC" statement for the model.
|
|
func (m *Model) OrderAsc(column string) *Model {
|
|
if len(column) == 0 {
|
|
return m
|
|
}
|
|
return m.Order(column + " ASC")
|
|
}
|
|
|
|
// OrderDesc sets the "ORDER BY xxx DESC" statement for the model.
|
|
func (m *Model) OrderDesc(column string) *Model {
|
|
if len(column) == 0 {
|
|
return m
|
|
}
|
|
return m.Order(column + " DESC")
|
|
}
|
|
|
|
// OrderRandom sets the "ORDER BY RANDOM()" statement for the model.
|
|
func (m *Model) OrderRandom() *Model {
|
|
model := m.getModel()
|
|
model.orderBy = m.db.OrderRandomFunction()
|
|
return model
|
|
}
|
|
|
|
// Group sets the "GROUP BY" statement for the model.
|
|
func (m *Model) Group(groupBy ...string) *Model {
|
|
if len(groupBy) == 0 {
|
|
return m
|
|
}
|
|
var (
|
|
core = m.db.GetCore()
|
|
model = m.getModel()
|
|
)
|
|
|
|
if model.groupBy != "" {
|
|
model.groupBy += ","
|
|
}
|
|
model.groupBy += core.QuoteString(strings.Join(groupBy, ","))
|
|
return model
|
|
}
|