Select Query Builder

The select query builder lets you construct SELECT queries using a fluent, chainable API. Use it when you need to fetch data from tables without the full model layer, or when building complex queries with joins, aggregations, and subqueries.

Overview

Nimbus provides two entry points for select queries:

  • database.From(db, "table") — Query a table by name; returns plain maps or structs.
  • database.QueryFor(db, model) — Query via a model; returns model instances with relationships and serialization.

Basic usage

// Fetch all published posts (plain objects)
var posts []Post
database.From(database.Get(), "posts").
    Where("status", "published").
    OrderBy("created_at desc").
    Get(&posts)

// Or use the model for type-safe results
database.QueryFor(database.Get(), &Post{}).
    Where("status", "published").
    OrderBy("created_at desc").
    Get(&posts)

Where clauses

Chain Where, OrWhere, WhereNotNull, and WhereNull to filter results.

// Simple equality
q.Where("status", "published")

// Operator: Where("column", "op", value)
q.Where("id", ">", 5)
q.Where("created_at", ">=", time.Now().AddDate(0, 0, -7))

// OR conditions
q.Where("status", "draft").OrWhere("status", "archived")

// Null checks
q.WhereNotNull("published_at")
q.WhereNull("deleted_at")

Select, Order, Limit, Offset

q.Select("id", "title", "created_at")
q.OrderBy("created_at desc")
q.Limit(20)
q.Offset(40)
q.Get(&posts)

First vs Get

First returns a single record; Get returns all matching records.

var post Post
q.First(&post)  // ORDER BY id LIMIT 1

var posts []Post
q.Get(&posts)   // all matches

Advanced: GORM DB

Use q.DB() to access the underlying GORM instance for joins, subqueries, and aggregations.

q := database.From(database.Get(), "posts")
q.DB().Joins("LEFT JOIN users ON users.id = posts.user_id").
    Select("posts.*, users.name as author_name").
    Find(&results)