Class Model<T>Abstract

Base for classes that are mapped to tables in a database.

Type Parameters

Hierarchy

Constructors

  • Type Parameters

    Parameters

    • Optional values: {
          [key: string]: any;
      }

      Pre-fill the model's properties from the given values. Calls boot() under the hood.

      • [key: string]: any

    Returns Model<T>

Properties

awareOfContainerLifecycle: true = ...
bus: Bus<Event>
dirtySourceRow?: QueryRow

Database fields that should be run on the next save, even if the fields are not mapped to members on the model.

logging: Logging
originalSourceRow?: QueryRow

The original row fetched from the database.

relationCache: Collection<{
    accessor: string | symbol;
    relation: Relation<T, any, any>;
}> = ...

Cache of relation instances by property accessor. This is used by the @Relation() decorator to cache Relation instances.

scopes: Collection<{
    accessor: string | Instantiable<Scope>;
    scope: ScopeClosure;
}> = ...
subscribers: Collection<BusSubscriber<ModelEvent<T>>> = ...

Local listeners subscribed to events on this bus.

subscriptions: Collection<BusInternalSubscription> = ...
uuid: string = ...
with: (keyof T)[] = []

Relations that should be eager-loaded by default.

CREATED_AT: null | string = 'created_at'

Optionally, the timestamp field set on creation.

UPDATED_AT: null | string = 'updated_at'

Optionally, the timestamp field set op update.

appends: string[] = []

Array of additional fields on the class that should be included in the object serializations.

connection: string = 'default'

The name of the connection this model should run through.

key: string

The name of the column that uniquely identifies this model.

masks: string[] = []

Array of fields on the class that should be excluded from the object serializations.

populateKeyOnInsert: boolean = false

If false (default), the primary key will be excluded from INSERTs.

table: string

The name of the table this model is stored in.

timestamps: boolean = true

If true, the CREATED_AT and UPDATED_AT columns will be automatically set.

Accessors

  • get isDirtyCheck(): ((field: ModelField) => boolean)
  • Protected

    Get a wrapped function that compares whether the given model field on the current instance differs from the originally fetched value.

    Used to filter for dirty fields.

    Returns ((field: ModelField) => boolean)

      • (field: ModelField): boolean
      • Protected

        Get a wrapped function that compares whether the given model field on the current instance differs from the originally fetched value.

        Used to filter for dirty fields.

        Parameters

        Returns boolean

Methods

  • Similar to assumeFromSource, but instead of mapping database fields to model properties, this function assumes the object contains a mapping of model properties to the values of those properties.

    Only properties with @Field() annotations will be set.

    Parameters

    • object: {
          [key: string]: any;
      }
      • [key: string]: any

    Returns Promise<Model<T>>

  • Given a row from the database, set the properties on this model that correspond to fields on that database.

    The row maps database fields to values, and the values are set for the properties that they correspond to based on the model's @Field() annotations.

    Parameters

    Returns Promise<Model<T>>

  • Create the inverse of a one-to-many relation. Should be called from a method on the model:

    Example

    class MyModel extends Model<MyModel> {
    @Related()
    public otherModels() {
    return this.hasMany(MyOtherModel)
    }
    }

    class MyOtherModel extends Model<MyOtherModel> {
    @Related()
    public myModels() {
    return this.belongsToMany(MyModel, 'otherModels')
    }
    }

    Type Parameters

    • T2 extends Model<T2, T2>

    Parameters

    Returns HasMany<T, T2>

  • Create the inverse of a one-to-one relation. Should be called from a method on the model:

    Example

    class MyModel extends Model<MyModel> {
    @Related()
    public otherModel() {
    return this.hasOne(MyOtherModel)
    }
    }

    class MyOtherModel extends Model<MyOtherModel> {
    @Related()
    public myModel() {
    return this.belongsToOne(MyModel, 'otherModel')
    }
    }

    Type Parameters

    • T2 extends Model<T2, T2>

    Parameters

    Returns HasOne<T, T2>

  • Initialize the model's properties from the given values and do any other initial setup.

    values can optionally be an object mapping model properties to the values of those properties. Only properties with @Field() annotations will be set.

    Parameters

    • Optional values: {
          [key: string]: unknown;
      }
      • [key: string]: unknown

    Returns void

  • Protected

    Call all local listeners for the given event. Returns true if the propagation of the event should be halted.

    Parameters

    • event: ModelEvent<T>

    Returns Promise<boolean>

  • Count all instances of this model in the database.

    Returns Promise<number>

  • Delete the current model from the database, if it exists.

    Returns Promise<void>

  • Get a query row mapping database columns to values for properties on this model that (1) have @Field() annotations and (2) have been modified since the record was fetched from the database or created.

    Returns QueryRow

  • Returns true if this instance's record has been persisted into the database.

    Returns boolean

  • Fetch a fresh instance of this record from the database.

    This returns a NEW instance of the SAME record by matching on the primary key. It does NOT change the current instance of the record.

    Returns Promise<undefined | Model<T>>

  • Get the method with the given name from this class, bound to this class.

    Returns

    function

    Parameters

    • methodName: string

    Returns ((...args: any[]) => any)

      • (...args: any[]): any
      • Get the method with the given name from this class, bound to this class.

        Returns

        function

        Parameters

        • Rest ...args: any[]

        Returns any

  • Returns an array of MODEL fields that have been modified since this record was fetched from the database or created.

    Returns string[]

  • Protected

    Returns a list of DATABASE fields that have been loaded for the current instance.

    Returns string[]

  • Get an object of the database field => value mapping that was originally fetched from the database. Excludes changes to model properties.

    Returns undefined | QueryRow

  • Create a new one-to-one relation instance. Should be called from a method on the model:

    Example

    class MyModel extends Model<MyModel> {
    @Related()
    public otherModels() {
    return this.hasMany(MyOtherModel)
    }
    }

    Type Parameters

    • T2 extends Model<T2, T2>

    Parameters

    • related: Instantiable<T2>
    • Optional foreignKeyOverride: keyof T & string
    • Optional localKeyOverride: keyof T2 & string

    Returns HasMany<T, T2>

  • Create a new one-to-one relation instance. Should be called from a method on the model:

    Example

    class MyModel extends Model<MyModel> {
    @Related()
    public otherModel() {
    return this.hasOne(MyOtherModel)
    }
    }

    Type Parameters

    • T2 extends Model<T2, T2>

    Parameters

    • related: Instantiable<T2>
    • Optional foreignKeyOverride: keyof T & string
    • Optional localKeyOverride: keyof T2 & string

    Returns HasOne<T, T2>

  • Protected

    Called when the model is instantiated. Use for any setup of events, &c.

    Returns void

  • Returns true if the other model refers to the same database record as this instance.

    This is done by comparing the qualified primary keys.

    Parameters

    Returns boolean

  • Returns true if none of the fields on this model have been modified since they were fetched from the database (and all exist in the database).

    Only fields with @Field() annotations are checked.

    Returns boolean

  • Returns true if any of the fields on this model have been modified since they were fetched from the database (or ones that were never saved to the database).

    Only fields with @Field() annotations are checked.

    Returns boolean

  • Get the value of the primary key of this model, if it exists.

    Returns string | number

  • Get the unqualified name of the column corresponding to the primary key of this model.

    Returns string

  • Call the make() method on the global container.

    Type Parameters

    • T

    Parameters

    • target: any
    • Rest ...parameters: any[]

    Returns T

  • Return an object of only the given properties on this model.

    Example

    Assume a is an instance of some model A with the given fields.

    const a = new A({ field1: 'field1 value', field2: 'field2 value', id: 123 })

    a.only('field1', 'id) // => {field1: 'field1 value', id: 123}

    Parameters

    • Rest ...fields: string[]

    Returns QueryRow

  • Populates an instance of the model with the same database fields that are set on this model, with the exclusion of the primary key.

    Useful for inserting copies of records.

    Example

    Assume a record, a, is an instance of some model A with the given fields.

    const a = A.find(123)  // => A{id: 123, name: 'some_name', other_field: 'a value'}

    const b = a.populate(new A) // => A{name: 'some_name', other_field: 'a value'}

    Parameters

    • model: T

    Returns Promise<T>

  • Given the name of a column, return the qualified name of the column as it could appear in a query.

    Example

    modelInstance.qualify('id')  // => 'model_table_name.id'
    

    Parameters

    • column: string

    Returns string

  • Return the qualified name of the column corresponding to the model's primary key.

    Example

    class A extends Model<A> {
    protected static table = 'table_a'
    protected static key = 'a_id'
    }

    const a = new A()
    a.qualifyKey() // => 'table_a.a_id'

    Returns string

  • Get a new query builder that yields instances of this model, pre-configured with this model's QuerySource, connection, and fields.

    Example

    await user.query()
    .where('name', 'LIKE', 'John Doe')
    .update({ username: 'jdoe' })

    Returns ModelBuilder<T>

  • Re-load the currently-loaded database fields from the table.

    Overwrites any un-persisted changes in the current instance.

    Returns Promise<void>

  • Persist the model into the database. If the model already exists, perform an update on its fields. Otherwise, insert a new row with its fields.

    Passing the withoutTimestamps will prevent the configured CREATED_AT/UPDATED_AT timestamps from being updated.

    Parameters

    • withoutTimestamps: {
          withoutTimestamps: undefined | boolean;
      } = {}
      • withoutTimestamps: undefined | boolean

    Returns Promise<Model<T>>

  • Sets a value in the override row and (if applicable) associated class property for the given database column.

    Parameters

    • key: string
    • value: unknown

    Returns Model<T>

  • Protected

    Sets a property on this to the value of a given property in object.

    Parameters

    • thisFieldName: string | symbol
    • objectFieldName: string
    • object: QueryRow

    Returns void

  • Returns true if the given event should be pushed to connected event busses.

    Parameters

    • event: ModelEvent<T>

    Returns Promise<boolean>

  • Get normalized values of the configured CREATED_AT/UPDATED_AT fields for this model.

    Example

    user.timestamps()  // => {updated: Date, created: Date}
    

    Returns {
        created?: Date;
        updated?: Date;
    }

    • Optional created?: Date
    • Optional updated?: Date
  • Cast the model to the base QueryRow object. The resultant object maps DATABASE fields to values, NOT MODEL fields to values.

    Only fields with @Field() annotations will be included.

    Returns QueryRow

  • Updates the timestamps for this model, if they are configured.

    If the model doesn't yet exist, set the CREATED_AT date. Always sets the UPDATED_AT date.

    Returns Model<T>

  • Returns true if the given field has changed since this model was fetched from the database, or if the given field never existed in the database.

    Parameters

    • field: string

    Returns boolean

  • Get the name of the connection where this model's table is found.

    Returns string

  • Find the first instance of this model where the primary key matches key.

    Example

    const user = await UserModel.findByKey(45)
    

    Type Parameters

    • T2 extends Model<T2, T2>

    Parameters

    Returns Promise<undefined | T2>

  • Given the name of a property on the model with a @Field() annotation, return the unqualified name of the database column it corresponds to.

    Parameters

    • modelKey: string

    Returns string

  • Given the name of a column, return the qualified name of the column as it could appear in a query.

    Example

    SomeModel.qualify('col_name')  // => 'model_table_name.col_name'
    

    Parameters

    • column: string

    Returns string

  • Return the qualified name of the column corresponding to the model's primary key.

    Example

    class A extends Model<A> {
    protected static table = 'table_a'
    protected static key = 'a_id'
    }

    A.qualifyKey() // => 'table_a.a_id'

    Returns string

  • Get a new query builder that yields instances of this model, pre-configured with this model's QuerySource, connection, and fields.

    Example

    const user = await UserModel.query<UserModel>().where('name', 'LIKE', 'John Doe').first()
    

    Type Parameters

    • T2 extends Model<T2, T2>

    Returns ModelBuilder<T2>

  • Get the QuerySource object for this model as it should be applied to query builders.

    This sets the alias for the model table equal to the table name itself, so it can be referenced explicitly in queries if necessary.

    Returns QuerySource

  • Sets the fully- and un-qualified canonical resolver strings. Intended for use by the Canonical unit.

    Parameters

    • fullyQualifiedResolver: string
    • unqualifiedResolver: string

    Returns void