Introduction

hook's schema allows you to define the data-types of your fields in collections, and assign relationships. It serves as well as a documentation of your current database schema for everyone in the team.

Example:

# hook-ext/schema.yaml
books:
  attributes:
    - name: name
      type: string
      required: true
    - name: price
      type: string
      index: true
    - name: discount
      type: decimal
    - name: stock
      type: text
    - name: description
      type: text
    - name: category
      type: text
    - name: isbn
      type: string
      unique: true
    - name: tag
      type: enum
      allowed: ['technology', 'science', 'it']
      default: 'science'
    - name: test
      type: decimal
      total: 10
      places: 5
      unique: ['tag', 'name']

Every time you change the hook-ext/schema.yaml file, it's required to run deploy command to modify it on the server.

hook deploy

Security

As you read in collections documentation, the collections always are auto-migrated when a new row is created with a field that doesn't exist in the database.

This may speed-up your development process, but it's scary to run this way in production. That is where lock_attributes come in:

# hook-ext/schema.yaml
books:
  lock_attributes: true
  attributes:
    - ...
    - ...

When a collection have lock_attributes, any field name provided for update or create will be ignored if it's not defined on your schema.

Data-types

Table of supported data-types:

Data-type Allowed attributes
boolean none
date none
date_time none
time none
timestamp none
binary none
text none
medium_text none
long_text none
enum allowed
char length
string length
float total, places
double total, places
decimal total, places
integer auto_increment, unsigned
big_integer auto_increment, unsigned
medium_integer auto_increment, unsigned
tiny_integer auto_increment, unsigned
small_integer auto_increment, unsigned

Relationships

belongs_to

books:
  relationships:
    belongs_to: author
books:
  relationships:
    belongs_to:
      - author
      - publisher

Complex example

authors:
  relationships:
    has_many:
      - posts

posts:
  relationships:
    belongs_to: authors

books:
  belongs_to:
    - auths
    - author:
        collection: auth       # defaults to 'authors' collection
        foreign_key: author_id # defaults to {related}_id (author_id)
        primary_key: _id       # defaults to '_id'
        required: true         # defaults to false, since our priority is to be as free as possible
        on_delete: restrict    # 'restrict', 'cascade' or 'none' (defaults to 'none')
        on_update: cascade     # 'restrict', 'cascade' or 'none' (defaults to 'none')

has_many

author:
  relationships:
    has_many: books
author:
  relationships:
    has_many:
      - books

has_one

author:
  relationships:
    has_one: book

has_many_through

# 'books' collection
books:
 attributes:
   - name: name
     type: string

# 'book_authors' intermediary collection
book_authors:
  relationships:
    belongs_to:
      - books
      - authors

# 'authors' collection
authors:
  attributes:
    - name: name
      type: string

  relationships:
    has_many:
      - books:
          through: book_authors
          collection: books  # defaults to 'books' collection
          foreign_key: author_id # defaults to {related}_id (author_id)
          far_key: # defaults to '{relation}_id' (book_id)
          local_key: _id # defaults to _id
          required: true # defaults to false, since our priority is to be as free as possible