feat(Scopes): make Schema and Table accessible from scopes
This commit is contained in:
parent
f82e9cfdbe
commit
3df271759b
33
callbacks.go
33
callbacks.go
@ -73,15 +73,6 @@ func (cs *callbacks) Raw() *processor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *processor) Execute(db *DB) *DB {
|
func (p *processor) Execute(db *DB) *DB {
|
||||||
// call scopes
|
|
||||||
for len(db.Statement.scopes) > 0 {
|
|
||||||
scopes := db.Statement.scopes
|
|
||||||
db.Statement.scopes = nil
|
|
||||||
for _, scope := range scopes {
|
|
||||||
db = scope(db)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
curTime = time.Now()
|
curTime = time.Now()
|
||||||
stmt = db.Statement
|
stmt = db.Statement
|
||||||
@ -100,13 +91,12 @@ func (p *processor) Execute(db *DB) *DB {
|
|||||||
stmt.Dest = stmt.Model
|
stmt.Dest = stmt.Model
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var modelParseError error
|
||||||
// parse model values
|
// parse model values
|
||||||
if stmt.Model != nil {
|
if stmt.Model != nil {
|
||||||
if err := stmt.Parse(stmt.Model); err != nil && (!errors.Is(err, schema.ErrUnsupportedDataType) || (stmt.Table == "" && stmt.TableExpr == nil && stmt.SQL.Len() == 0)) {
|
if modelParseError = stmt.Parse(stmt.Model); modelParseError != nil && (!errors.Is(modelParseError, schema.ErrUnsupportedDataType) || (stmt.Table == "" && stmt.TableExpr == nil && stmt.SQL.Len() == 0)) {
|
||||||
if errors.Is(err, schema.ErrUnsupportedDataType) && stmt.Table == "" && stmt.TableExpr == nil {
|
if !errors.Is(modelParseError, schema.ErrUnsupportedDataType) || stmt.Table != "" || stmt.TableExpr != nil {
|
||||||
db.AddError(fmt.Errorf("%w: Table not set, please set it like: db.Model(&user) or db.Table(\"users\")", err))
|
_ = db.AddError(modelParseError)
|
||||||
} else {
|
|
||||||
db.AddError(err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -122,10 +112,23 @@ func (p *processor) Execute(db *DB) *DB {
|
|||||||
stmt.ReflectValue = stmt.ReflectValue.Elem()
|
stmt.ReflectValue = stmt.ReflectValue.Elem()
|
||||||
}
|
}
|
||||||
if !stmt.ReflectValue.IsValid() {
|
if !stmt.ReflectValue.IsValid() {
|
||||||
db.AddError(ErrInvalidValue)
|
_ = db.AddError(ErrInvalidValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// call scopes
|
||||||
|
for len(db.Statement.scopes) > 0 {
|
||||||
|
scopes := db.Statement.scopes
|
||||||
|
db.Statement.scopes = nil
|
||||||
|
for _, scope := range scopes {
|
||||||
|
db = scope(db)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if stmt.Table == "" && stmt.TableExpr == nil && stmt.SQL.Len() == 0 {
|
||||||
|
_ = db.AddError(fmt.Errorf("%w: Table not set, please set it like: db.Model(&user) or db.Table(\"users\")", modelParseError))
|
||||||
|
}
|
||||||
|
|
||||||
for _, f := range p.fns {
|
for _, f := range p.fns {
|
||||||
f(db)
|
f(db)
|
||||||
}
|
}
|
||||||
|
51
tests/schema_in_scopes_test.go
Normal file
51
tests/schema_in_scopes_test.go
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package tests_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/schema"
|
||||||
|
. "gorm.io/gorm/utils/tests"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSchemaAccessibleFromScopes(t *testing.T) {
|
||||||
|
users := []User{
|
||||||
|
*GetUser("schema-scope-1", Config{}),
|
||||||
|
*GetUser("schema-scope-2", Config{}),
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := DB.Create(&users).Error; err != nil {
|
||||||
|
t.Fatalf("errors happened when create users: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var schema *schema.Schema
|
||||||
|
var tableName string
|
||||||
|
scope := func(db *gorm.DB) *gorm.DB {
|
||||||
|
schema = db.Statement.Schema
|
||||||
|
tableName = db.Statement.Table
|
||||||
|
return db
|
||||||
|
}
|
||||||
|
|
||||||
|
var results []User
|
||||||
|
if err := DB.Scopes(scope).Select("name", "age").Where("name like ?", "schema-scope-%").Find(&results).Error; err != nil {
|
||||||
|
t.Errorf("failed to query users, got error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expects := []User{
|
||||||
|
{Name: "schema-scope-1", Age: 18},
|
||||||
|
{Name: "schema-scope-2", Age: 18},
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(results) != 2 {
|
||||||
|
t.Fatalf("invalid results length found, expects: %v, got %v", len(expects), len(results))
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedTableName := "users"
|
||||||
|
if tableName != expectedTableName {
|
||||||
|
t.Errorf("invalid table name found, expects: %v, got %v", expectedTableName, tableName)
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema == nil {
|
||||||
|
t.Errorf("invalid schema found, expected non-nil schema")
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user