Skip to content

Association

Queryx supports association definition in the schema file. It also generates corresponding preload query methods to avoid "N+1" query.

belongs_to

hcl
model "Post" {
  belongs_to "author" {
    model_name = "User"
  }
}
model "Post" {
  belongs_to "author" {
    model_name = "User"
  }
}
go
c.QueryPost().PreloadAuthor().All()
c.QueryPost().PreloadAuthor().All()

has_one

hcl
model "User" {
  has_one "account" {}

  column "name" {
    type = string
  }
}

model "Account" {
  belongs_to "user" {}

  column "name" {
    type = string
  }
}
model "User" {
  has_one "account" {}

  column "name" {
    type = string
  }
}

model "Account" {
  belongs_to "user" {}

  column "name" {
    type = string
  }
}

go
c.QueryUser().PreloadAccount().All()
c.QueryAccount().PreloadUser().All()
c.QueryUser().PreloadAccount().All()
c.QueryAccount().PreloadUser().All()

has_many

hcl
model "User" {
  belongs_to "group" {}

  column "name" {
    type = string
  }
}

model "Group" {
  has_many "users" {}

  column "name" {
    type = string
  }
}
model "User" {
  belongs_to "group" {}

  column "name" {
    type = string
  }
}

model "Group" {
  has_many "users" {}

  column "name" {
    type = string
  }
}

go
c.QueryUser().PreloadGroup().All()
c.QueryGroup().PreloadUsers().All()
c.QueryUser().PreloadGroup().All()
c.QueryGroup().PreloadUsers().All()

has_many through

hcl
model "User" {
  has_many "user_posts" {}
  has_many "posts" {
    through = "user_posts"
  }
}

model "Post" {
  has_many "user_posts" {}
  has_many "users" {
    through = "user_posts"
  }
}

model "UserPost" {
  belongs_to "user" {}
  belongs_to "post" {}
}
model "User" {
  has_many "user_posts" {}
  has_many "posts" {
    through = "user_posts"
  }
}

model "Post" {
  has_many "user_posts" {}
  has_many "users" {
    through = "user_posts"
  }
}

model "UserPost" {
  belongs_to "user" {}
  belongs_to "post" {}
}

go
c.QueryUser().PreloadPosts().All()
c.QueryPost().PreloadUsers().All()
c.QueryUser().PreloadPosts().All()
c.QueryPost().PreloadUsers().All()

Released under the Apache License.