多级加载
This commit is contained in:
		@@ -17,6 +17,30 @@ import (
 | 
			
		||||
	"gorm.io/gorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var db *gorm.DB
 | 
			
		||||
var err error
 | 
			
		||||
 | 
			
		||||
func LoadItem(requestedFields []ast.Selection) (data []string) {
 | 
			
		||||
	var items = []string{"user", "article"}
 | 
			
		||||
	for _, field := range requestedFields {
 | 
			
		||||
		fieldAST, _ := field.(*ast.Field)
 | 
			
		||||
		if funk.Contains(items, fieldAST.Name.Value) {
 | 
			
		||||
			data = append(data, fieldAST.Name.Value)
 | 
			
		||||
			for _, str := range LoadItem(fieldAST.SelectionSet.Selections) {
 | 
			
		||||
				str = strings.ToUpper(string(str[0])) + str[1:]
 | 
			
		||||
				data = append(data, fieldAST.Name.Value+"."+str)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if fieldAST.Name.Value == "list" {
 | 
			
		||||
			for _, str := range LoadItem(fieldAST.SelectionSet.Selections) {
 | 
			
		||||
				str = strings.ToUpper(string(str[0])) + str[1:]
 | 
			
		||||
				data = append(data, str)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return data
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 自动生成 GraphQL 类型的函数
 | 
			
		||||
func generateGraphQLType(model interface{}) (*graphql.Object, error) {
 | 
			
		||||
	modelType := reflect.TypeOf(model)
 | 
			
		||||
@@ -52,7 +76,7 @@ func generateGraphQLType(model interface{}) (*graphql.Object, error) {
 | 
			
		||||
 | 
			
		||||
func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
 | 
			
		||||
	db, err := gorm.Open(mysql.Open(fmt.Sprintf(
 | 
			
		||||
	db, err = gorm.Open(mysql.Open(fmt.Sprintf(
 | 
			
		||||
		"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
 | 
			
		||||
		config.Mysql.UserName,
 | 
			
		||||
		config.Mysql.Password,
 | 
			
		||||
@@ -88,7 +112,7 @@ func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
			"user_name":   &graphql.Field{Type: graphql.String, Description: "用户名"},
 | 
			
		||||
			"avatar":      &graphql.Field{Type: graphql.String, Description: "用户头像"},
 | 
			
		||||
			"rank":        &graphql.Field{Type: graphql.String, Description: "用户等级"},
 | 
			
		||||
			"price":       &graphql.Field{Type: graphql.Float, Description: "用户金币"},
 | 
			
		||||
			"price":       &graphql.Field{Type: graphql.Int, Description: "用户金币"},
 | 
			
		||||
			"create_time": &graphql.Field{Type: graphql.DateTime, Description: "用户创建时间"},
 | 
			
		||||
			"update_time": &graphql.Field{Type: graphql.DateTime, Description: "用户更新时间"},
 | 
			
		||||
		},
 | 
			
		||||
@@ -190,16 +214,14 @@ func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
	// 将 list 中的字段提取出来用于查询
 | 
			
		||||
	get_fields := func(requestedFields []ast.Selection) (fields []string) {
 | 
			
		||||
		for _, field := range requestedFields {
 | 
			
		||||
			fieldAST, ok := field.(*ast.Field)
 | 
			
		||||
			if ok && fieldAST.Name.Value == "list" {
 | 
			
		||||
			fieldAST, _ := field.(*ast.Field)
 | 
			
		||||
			if fieldAST.Name.Value == "list" {
 | 
			
		||||
				for _, field := range fieldAST.SelectionSet.Selections {
 | 
			
		||||
					fieldAST, ok := field.(*ast.Field)
 | 
			
		||||
					if ok {
 | 
			
		||||
					fieldAST, _ := field.(*ast.Field)
 | 
			
		||||
					fields = append(fields, fieldAST.Name.Value)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		}
 | 
			
		||||
		return fields
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -380,7 +402,6 @@ func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
 | 
			
		||||
				var total int
 | 
			
		||||
				var images []Image
 | 
			
		||||
				var fields = get_fields(p.Info.FieldASTs[0].SelectionSet.Selections)
 | 
			
		||||
				var query = db.Limit(limit)
 | 
			
		||||
 | 
			
		||||
				// 参数映射
 | 
			
		||||
@@ -518,16 +539,12 @@ func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
					query = query.Where("id IN ?", list)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				for index, item := range LoadItem(p.Info.FieldASTs[0].SelectionSet.Selections) {
 | 
			
		||||
					fmt.Println(index, item)
 | 
			
		||||
					query = query.Preload(item)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// 输出
 | 
			
		||||
				if funk.Contains(fields, "user") {
 | 
			
		||||
					query = query.Preload("User")
 | 
			
		||||
					fmt.Println("加载 user")
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if funk.Contains(fields, "article") {
 | 
			
		||||
					query = query.Preload("Article")
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if err := query.Find(&images).Error; err != nil {
 | 
			
		||||
					fmt.Println("获取图像列表失败", err)
 | 
			
		||||
					return nil, err
 | 
			
		||||
 
 | 
			
		||||
@@ -92,9 +92,10 @@ func (a *TextList) Scan(value interface{}) error {
 | 
			
		||||
 | 
			
		||||
type User struct {
 | 
			
		||||
	ID         int       `json:"id"          db:"id" gorm:"primaryKey"`
 | 
			
		||||
	UserName   *string   `json:"user_name"   db:"user_name"`
 | 
			
		||||
	Avatar     *string   `json:"avatar"      db:"avatar"`
 | 
			
		||||
	Rank       *string   `json:"rank"        db:"rank"`
 | 
			
		||||
	UserName   string    `json:"user_name"   db:"user_name"`
 | 
			
		||||
	Avatar     string    `json:"avatar"      db:"avatar"`
 | 
			
		||||
	Rank       string    `json:"rank"        db:"rank"`
 | 
			
		||||
	Price      int       `json:"price"       db:"price"`
 | 
			
		||||
	CreateTime time.Time `json:"create_time" db:"create_time"`
 | 
			
		||||
	UpdateTime time.Time `json:"update_time" db:"update_time"`
 | 
			
		||||
}
 | 
			
		||||
@@ -108,6 +109,8 @@ type Article struct {
 | 
			
		||||
	Title       string    `json:"title"       db:"title"`
 | 
			
		||||
	Orientation string    `json:"orientation" db:"orientation"`
 | 
			
		||||
	Tags        string    `json:"tags"        db:"tags"`
 | 
			
		||||
	UserId      int       `json:"user_id"     db:"user_id"`
 | 
			
		||||
	User        User      `json:"user"        gorm:"foreignKey:UserId"`
 | 
			
		||||
	CreateTime  time.Time `json:"create_time" db:"create_time"`
 | 
			
		||||
	UpdateTime  time.Time `json:"update_time" db:"update_time"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user