Skip to main content

Fields

The fields block tells ONQL which columns exist on an entity and what to call them in queries.

Basic mapping

"users": {
"table": "users",
"fields": {
"id": "id",
"name": "name",
"email": "email"
}
}

The key (left) is the query-side name. The value (right) is the actual column name in the database. Above, the names are identical — that's the simple case.

Aliasing a column

Maybe your DB column is usr_email_addr but you want queries to say email:

"fields": {
"email": "usr_email_addr"
}

A query of shop.users{email} will read from the usr_email_addr column under the hood.

Why declare fields at all?

ONQL only lets you query fields you've declared. Two reasons:

  1. Safety — un-declared columns are invisible. Internal columns like password_hash or pii_blob simply don't exist as far as queries are concerned.
  2. Performance — declared fields can be indexed. ONQL creates reverse indexes for every declared field.

Field types

Types are inferred from the underlying storage. For finer control (validation, formatting), declare them in the database schema layer — see the project README's "Laravel-style validation" section.

Common patterns

Hide an internal column

Just don't include it in fields. There's no opt-out — exclusion is the default.

Expose only safe columns

Project out everything you don't need:

"users_public": {
"table": "users",
"fields": {
"id": "id",
"name": "name"
}
}

Rename for the frontend

"fields": {
"createdAt": "created_at",
"updatedAt": "updated_at"
}

Now your frontend can write users{createdAt, updatedAt} and stay in camelCase.