Skip to main content

Read Data

Query Object

To read data from database with rex, a query object need to be created first. Rex generates query object for each model in schema. For example, c.QueryUser() returns a query object for users table.

userQuery := c.QueryUser()

An alternative query method is provided to support context in go.

userQuery := c.QueryUserContext(ctx)

Find

Find method is used to fetch single object from database by primary key, for example:

user, err := c.QueryUser().Find(1);

A NotFoundError is returned if no row is found with the provided primary key.

Find By

user, err := c.QueryUser().FindBy(c.UserID.EQ(1));

Find by SQL

users, err := c.QueryUser().FindBySQL("select * from users limit ?", 10)

Select

userQuery = userQuery.Select(c.UserID, c.UserEmail)

Select Distinct

For query with SELECT DISTINCT

userQuery = userQuery.SelectDistinct(c.UserID, c.UserEmail)

Pluck

emails, err := userQuery.Pluck(c.userEmail).AllString()

Where

Rex generates query conditions based on colum types.

  • EQ -
  • In -
userQuery = userQuery.Where(c.UserID.In([]int{1, 2, 3}))

Multiple arguments in Where will convert into sql AND,

userQuery = userQuery.Where(
c.UserName.EQ("test"),
c.UserEmail.EQ("test@example.com"),
)

Order

userQuery = userQuery.Order(c.UserCreatedAt.Desc(), c.UserID.Asc())

Limit and Offset

userQuery = userQuery.Limit(10).Offset(5)

Joins

// Inner join
userQuery.Joins(c.Post)
// SELECT users.* FROM users INNER JOIN posts ON posts.user_id = users.id

userQuery.RawJoins("INNER JOIN posts ON posts.user_id = users.id")

// Multiple joins
userQuery.Joins(c.Post, c.Account)


// Nested joins? posts -> comments
userQuery.Joins(c.Post, c.Comment)

Group and Aggregation

userQuery.Group(c.UserName)

Having

userQuery.Having(c.UserName.EQ())

Query Associations

userQuery, err := userQuery.IncludePosts()
userQuery := userQuery.IncludePosts(func (q *postQuery) {
return q.Limit(3) // first 3 posts for each user
})

Query Methods

A query builder supports several methods based on query purposes.

All

Return all records from query

users, err := userQuery.All()

First

Return the first record from query

users, err := userQuery.First()

Exists

Return whether the query contains any result

exists, err := userQuery.Exists()

Count

Return with COUNT query

total, err := userQuery.Count()

Query Batching