This repository was archived by the owner on Nov 6, 2021. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 17
Pagination
B1nj0y edited this page Sep 5, 2017
·
38 revisions
What's a keyset pagination: http://use-the-index-luke.com/no-offset.
Take a model named Post as an example. A data type PostPage will be generated for paginating:
type PostPage struct {
WhereString string
WhereParams []interface{}
Order map[string]string
FirstId int64
LastId int64
PageNum int
PerPage int
TotalPages int
TotalItems int64
}And meanwhile generated three methods Current, Next and Previous:
// Current get the current page of PostPage object for pagination
func (_p *PostPage) Current() ([]Post, error)
// Current get the next page of PostPage object for pagination
func (_p *PostPage) Next() ([]Post, error)
// Current get the previous page of PostPage object for pagination
func (_p *PostPage) Previous() ([]Post, error)You can init a PostPage at first:
pp := PostPage{Order: map[string]string{"id": "desc"}, PerPage: 5}Then get the first page:
ps, err := pp.Current()Then next page:
ps, err = pp.Next()Or back to previous page:
ps, err = pp.Previous()Show the current page number:
fmt.Println(pp.PageNum)Show total pages and total count:
fmt.Println(pp.TotalPages)
fmt.Println(pp.TotalItems)You can add a where clause with parameters as a filter when init a PostPage object:
pp := PostPage{
WhereString: "title LIKE ? AND hits > ?",
WhereParams: []interface{}{"%go-on-rails%", 200},
Order: map[string]string{"id": "desc"},
PerPage: 5}Here the WhereString is a ? binding with WhereParams correspondingly.