Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

urlstruct decodes url.Values into structs

Build Status GoDoc

Example

Following example decodes URL query ?page=2&limit=100&author_id=123 into a struct and uses go-pg feature WhereStruct to autogenerate WHERE clause:

type Book struct {
	tableName struct{} `pg:"alias:b"`

	ID        int64
	AuthorID  int64
	CreatedAt time.Time
}

type BookFilter struct {
	tableName struct{} `urlstruct:"b"`

	urlstruct.Pager
	AuthorID int64
}

func ExampleUnmarshal_filter() {
	db := pg.Connect(&pg.Options{
		User:     "postgres",
		Password: "",
		Database: "postgres",
	})
	defer db.Close()

	values := url.Values{
		"author_id": {"123"},
		"page":      {"2"},
		"limit":     {"100"},
	}
	filter := new(BookFilter)
	err := urlstruct.Unmarshal(values, filter)
	if err != nil {
		panic(err)
	}

	filter.Pager.MaxLimit = 100     // default max limit is 1000
	filter.Pager.MaxOffset = 100000 // default max offset is 1000000

	// Following query generates:
	//
	// SELECT "b"."id", "b"."author_id", "b"."created_at"
	// FROM "books" AS "b"
	// WHERE "b".author_id = 123
	// LIMIT 100 OFFSET 100

	var books []*Book
	_ = db.Model(&books).
		WhereStruct(filter).
		Limit(filter.Pager.GetLimit()).
		Offset(filter.Pager.GetOffset()).
		Select()

	fmt.Println("author", filter.AuthorID)
	fmt.Println("limit", filter.GetLimit())
	fmt.Println("offset", filter.GetLimit())
	// Output: author 123
	// limit 100
	// offset 100
}
You can’t perform that action at this time.