-
Notifications
You must be signed in to change notification settings - Fork 0
ModelsType
class ModelsType extends RelationalTypeBase 📜
A "virtual" field type that defines a one to many,
or many to many relationship with other model(s).
Many to many relationships interact with "sets", which in Mythix ORM is the term used to define an "array of models", in our N to many relationship.
Relationships (also known as "associations") in Mythix ORM are defined by virtual fields that return a "relationship query" from a method known as a "query generator" that is defined along with the type definition. This "relationship query" itself defines the model relationship, no matter how complicated. Other ORMs require that you define relationships via their "through table", matching foreign key, type, etc... In Mythix ORM, everything is simply defined as a query for the relationship.
This field type can be used to define a virtual field
that defines a relationship to other models. When your
model is instantiated into an instance, then this type will
inject the following methods into your model instance to
assist you in interacting with the relationship set. The "injected methods"
listed below are "prefixes". The full names of these methods are
always postfixed with the actual name of your field that defines
the relationship. For example, if you had a roles field
that defined this type of relationship, then the methods injected
would be model.getRoles, model.destroyRoles, model.pluckRoles, etc...
| Injected Method Prefix | Full Method Name | Signature | Description |
|---|---|---|---|
addTo |
addTo${fieldName} |
addTo(models: Array<Model | object>, options?: object): Promise<Array<Model>> |
Create the models defined by the relationship, and add them to the set. Returns the newly created models. |
count |
count${fieldName} |
count(userQuery?: QueryEngine, options?: object, ...args: Array<any>): Promise<number> |
Count the number of models in the set. |
destroy |
destroy${fieldName} |
destroy(options?: object, ...args: Array<any>): Promise<number> |
Destroy the models defined by the relationship set. Returns the number of models destroyed. Note that this not only destroys the target models, but also any through-table relationships involved. |
get |
get${fieldName} |
get(userQuery?: QueryEngine, options?: object, ...args: Array<any>): Promise<Array<Model>> |
Get the models specified by the relationship set. Return the entire model set. |
has |
has${fieldName} |
has(userQuery?: QueryEngine, options?: object, ...args: Array<any>): Promise<boolean> |
Check if the relationship set contains any models. |
pluck |
pluck${fieldName} |
pluck(userQuery?: QueryEngine, fields: Field | string | Array<Field | string>, options?: object, ...args: Array<any>): Promise<Array<any>> |
Pluck specific fields from the related models (set). |
queryFor |
queryFor${fieldName} |
queryFor(userQuery?: QueryEngine, options?: object, ...args: Array<any>): Promise<QueryEngine> |
Get the raw relationship query defined by this field type (returned by the "query generator"). |
removeFrom |
removeFrom${fieldName} |
removeFrom(models: Array<Model>, options?: object): Promise<number> |
Remove the specified models from the relationship set without destroying the target models (destroy only the through-table linking models). Returns the number of models remaining in the set after the operation. |
set |
set${fieldName} |
set(models: Array<Model | object>, options?: object): Promise<Array<Model>> |
Overwrite the model set with the models specified, destroying models outside the specified set of models. Returns the new models. |
The ...args provided for each injected method are pass-through args for the user, that allow
the user to pass any arguments they desire to the "relational query generator" method defined
by the field (the ...userArgs as seen in the example below). One minor exception to this is
any method that has a userQuery argument. The userQuery argument will always also be passed as the
first argument to the ...userArgs of the "query generator" method. The userQuery argument
is to allow the user to define an extra query to merge into the primary/root query of the relationship.
For example, in the example provided below, we could call await user.getRoles(Role.where.name.EQ('admin'))
to only get the related roles where each role also has a name attribute with the value 'admin'.
This type also injects duplicates of each of these relational methods with an underscore prefix, i.e.
_getRoles. These are known as "root methods". They are provided so the user can overload the
default implementations. For example, you could define a getRoles method on your model class,
and from that call the "super" method simply by calling this._getRoles. This is required because
with method injection super doesn't actually exist, because the method was injected, instead of being
defined on the model class's prototype.
Example:
-
class User extends Model { static fields = { ..., // Add a virtual relationship field, which creates a // one to many relationship with the Role model. // // Notice how a "type" can always be used directly as // the field definition, instead of defining an object // with a "type" property. roles: Types.Models( // Specify the target/root model. 'Role', // Define our "query generator" method that // will return our "relationship query". (context, connectionModels, ...userArgs) => { // Get the model we need from the connection, // which is conveniently passed to us as the // `connectionModels` argument here. let { Role } = connectionModels; // Get the "self", which is the model instance // calling this method // (i.e. with `model.getRoles()`, "self" would be "model") let { self } = context; // Now return a relationship query return Role.where .userID .EQ(self.id) .AND .MERGE(userArgs[0]); // Apply the `userQuery` (will do nothing if nullish) }, ), }; } // ... later on // get the "roles" for the first user in the database let user = await User.first(); // Call relationship method injected by the `Types.Models` type. let allUserRoles = await user.getRoles();
Notes:
- See the Associations article for a more in-depth discussion of Mythix ORM model relationship/associations.
- The "query generator" method defined with the type can be an asynchronous method.
- Relational methods will not be injected into the model instance if a method of
the same name already exists on the model instance. For example, if you define a
getRolesmethod on your model class, then the defaultgetrelational method (getRolesin our example) won't be injected. However, the "root method"_getRoleswill still be injected, allowing you to call that as thesupermethod instead. - This field type will not be "exposed" to models. This means that your model will not
have an attribute with the name provided by the field defining this type. The only
thing that will exist on your model will be the relational methods injected by this type.
Said another way, and using the examples provided, there will be no "roles" attribute
on your
Usermodel.
method ModelsType::fieldNameToOperationName(
field: Field,
operation: string,
rootMethod: boolean,
): string 📜
Internal method used to generate injected method names.
This method likely should never be called by the user. It is used to generate the injected method names.
Arguments:
-
field: FieldThe parent field defining this relationship.
-
operation:stringThe operation being injected into the model instance, which is one of the prefixes listed above, i.e.
addTo,get,destroy, etc... -
rootMethod:booleanIf
true, then return a generated "root method" name, instead of a "user method". The only difference is that the "root method" name is prefixed with an underscore_.
Return value: string
The method name to inject into the model instance.
method ModelsType::initialize(
connection: Connection,
self: Model,
) 📜
Inject type methods into the model instance.
The Type.initialize method is always called for each model that is instantiated. For this type, this is used to inject the relational methods into the model instance.
Arguments:
-
connection: ConnectionThe connection for the model being instantiated.
-
self: ModelThe model instance the type is being initialized for.
- Associations
- Certifications
- Connection Binding
- Home
- Models
- Queries
- TypeScript
- Types Reference
-
namespace AsyncStore
- function getContextStore
- function getContextValue
- function runInContext
- function setContextValue
-
namespace Helpers
- function checkDefaultValueFlags
- function defaultValueFlags
- function getDefaultValueFlags
- property FLAG_LITERAL
- property FLAG_ON_INITIALIZE
- property FLAG_ON_INSERT
- property FLAG_ON_STORE
- property FLAG_ON_UPDATE
- property FLAG_REMOTE
-
namespace MiscUtils
- function collect
- function valueToDateTime
-
namespace ModelUtils
- function parseQualifiedName
-
namespace QueryUtils
- function generateQueryFromFilter
- function mergeFields
- function parseFilterFieldAndOperator
-
class AverageLiteral
- method static isAggregate
- method toString
-
class BigIntType
- property Default
- method castToType
- method constructor
- method isValidValue
- method static getDisplayName
- method toString
-
class BlobType
- method castToType
- method constructor
- method isValidValue
- method static getDisplayName
- method toString
-
class BooleanType
- method castToType
- method isValidValue
- method static getDisplayName
- method toString
-
class CacheKey
- method constructor
- method valueOf
-
class CharType
- method castToType
- method isValidValue
- method static getDisplayName
- method toString
-
class ConnectionBase
- property _isMythixConnection
- property DefaultQueryGenerator
- property dialect
- property Literals
- method _averageLiteralToString
- method _bigintTypeToString
- method _blobTypeToString
- method _booleanTypeToString
- method _charTypeToString
- method _countLiteralToString
- method _datetimeTypeToString
- method _dateTypeToString
- method _distinctLiteralToString
- method _escape
- method _escapeID
- method _fieldLiteralToString
- method _getFromModelCache
- method _integerTypeToString
- method _maxLiteralToString
- method _minLiteralToString
- method _numericTypeToString
- method _realTypeToString
- method _setToModelCache
- method _stringTypeToString
- method _sumLiteralToString
- method _textTypeToString
- method _uuidV1TypeToString
- method _uuidV3TypeToString
- method _uuidV4TypeToString
- method _uuidV5TypeToString
- method _xidTypeToString
- method addColumn
- method addIndex
- method aggregate
- method alterColumn
- method alterTable
- method average
- method buildConnectionContext
- method bulkModelOperation
- method constructor
- method convertDateToDBTime
- method count
- method createContext
- method createQueryGenerator
- method createTable
- method createTables
- method destroy
- method destroyModels
- method dirtyFieldHelper
- method dropColumn
- method dropIndex
- method dropTable
- method dropTables
- method ensureAllModelsAreInstances
- method escape
- method escapeID
- method exists
- method finalizeQuery
- method findModelField
- method getContextValue
- method getDefaultFieldValue
- method getDefaultOrder
- method getField
- method getLockMode
- method getModel
- method getModels
- method getOptions
- method getQueryEngineClass
- method getQueryGenerator
- method insert
- method isStarted
- method literalToString
- method max
- method min
- method parseQualifiedName
- method pluck
- method prepareAllModelsAndSubModelsForOperation
- method prepareAllModelsForOperation
- method query
- method registerModel
- method registerModels
- method runSaveHooks
- method select
- method setContextValue
- method setPersisted
- method setQueryGenerator
- method splitModelAndSubModels
- method stackAssign
- method start
- method static getLiteralClassByName
- method static isConnection
- method static isConnectionClass
- method static Literal
- method stop
- method sum
- method toQueryEngine
- method transaction
- method truncate
- method typeToString
- method update
- method updateAll
- method upsert
-
class CountLiteral
- method static isAggregate
- method static isFieldRequired
- method toString
-
class DateTimeType
- property Default
- method castToType
- method constructor
- method deserialize
- method isValidValue
- method serialize
- method static getDisplayName
- method toString
-
class DateType
- property Default
- method castToType
- method constructor
- method deserialize
- method isValidValue
- method serialize
- method static getDisplayName
- method toString
-
class DistinctLiteral
- method toString
-
class Field
- property _isMythixField
- property allowNull
- property defaultValue
- property fieldName
- property get
- property index
- property primaryKey
- property set
- property type
- property unique
- property validate
- method clone
- method constructor
- method setModel
- method static isField
- method static isFieldClass
-
class FieldLiteral
- method toString
- class FieldScope
-
class ForeignKeyType
- method castToType
- method constructor
- method getOptions
- method getTargetField
- method getTargetFieldName
- method getTargetModel
- method getTargetModelName
- method initialize
- method isValidValue
- method parseOptionsAndCheckForErrors
- method static getDisplayName
- method static isForeignKey
- method toString
-
class IntegerType
- property Default
- method castToType
- method constructor
- method isValidValue
- method static getDisplayName
- method toString
-
class Literal
- method constructor
-
class LiteralBase
- property _isMythixLiteral
- method constructor
- method definitionToField
- method fullyQualifiedNameToDefinition
- method static isAggregate
- method static isLiteral
- method static isLiteralClass
- method static isLiteralType
- method toString
- method valueOf
-
class LiteralFieldBase
- method constructor
- method getField
- method getFullyQualifiedFieldName
- method static isFieldRequired
- method valueOf
-
class MaxLiteral
- method static isAggregate
- method toString
-
class MinLiteral
- method static isAggregate
- method toString
-
class Model
- property _isMythixModel
- method _castFieldValue
- method _constructField
- method _constructFields
- method _constructor
- method _getConnection
- method _getDirtyFields
- method _getFieldValue
- method _initializeFieldData
- method _initializeModelData
- method _setFieldValue
- method clearDirty
- method constructor
- method destroy
- method getAttributes
- method getConnection
- method getDataValue
- method getDirtyFields
- method getOptions
- method hasValidPrimaryKey
- method isDirty
- method isPersisted
- method onAfterCreate
- method onAfterSave
- method onAfterUpdate
- method onBeforeCreate
- method onBeforeSave
- method onBeforeUpdate
- method onValidate
- method reload
- method save
- method setAttributes
- method setDataValue
- method static _getConnection
- method static all
- method static bindConnection
- method static count
- method static create
- method static cursor
- method static defaultScope
- method static finalizeQuery
- method static first
- method static getConcreteFieldCount
- method static getContextValue
- method static getField
- method static getFields
- method static getForeignKeyFieldsMap
- method static getForeignKeysTargetField
- method static getForeignKeysTargetFieldNames
- method static getForeignKeysTargetModelNames
- method static getForeignKeysTargetModels
- method static getModel
- method static getModelContext
- method static getModelName
- method static getPluralModelName
- method static getPrimaryKeyField
- method static getPrimaryKeyFieldName
- method static getQueryEngine
- method static getQueryEngineClass
- method static getSingularName
- method static getSortedFields
- method static getTableName
- method static getUnscopedQueryEngine
- method static getWhereWithConnection
- method static hasField
- method static hasRemoteFieldValues
- method static initializeFields
- method static isForeignKeyTargetModel
- method static isModel
- method static isModelClass
- method static iterateFields
- method static last
- method static mergeFields
- method static pluck
- method static primaryKeyHasRemoteValue
- method static setContextValue
- method static toString
- method static updateModelContext
- method toJSON
- method toString
- method updateDirtyID
-
class ModelScope
- method _getField
- method AND
- method CROSS_JOIN
- method DISTINCT
- method EXISTS
- method Field
- method FULL_JOIN
- method GROUP_BY
- method HAVING
- method INNER_JOIN
- method JOIN
- method LEFT_JOIN
- method LIMIT
- method mergeFields
- method NOT
- method OFFSET
- method OR
- method ORDER
- method PROJECT
- method RIGHT_JOIN
-
class ModelType
- method fieldNameToOperationName
- method initialize
-
class ModelsType
- method fieldNameToOperationName
- method initialize
-
class NumericType
- method castToType
- method constructor
- method isValidValue
- method static getDisplayName
- method toString
-
class ProxyClass
- property APPLY
- property AUTO_CALL
- property AUTO_CALL_CALLED
- property AUTO_CALL_CALLER
- property CALLABLE
- property CONSTRUCT
- property DEFINE_PROPERTY
- property DELETE_PROPERTY
- property GET
- property GET_OWN_PROPERTY_DESCRIPTOR
- property GET_PROTOTYPEOF
- property HAS
- property IS_EXTENSIBLE
- property MISSING
- property OWN_KEYS
- property PREVENT_EXTENSIONS
- property PROXY
- property SELF
- property SET
- property SET_PROTOTYPEOF
- property shouldSkipProxy
- property TARGET
- method ___autoCall
- method ___call
- method constructor
-
class QueryEngine
- method all
- method average
- method constructor
- method count
- method cursor
- method destroy
- method exists
- method finalizeQuery
- method first
- method getFieldScopeClass
- method getModelScopeClass
- method last
- method max
- method MERGE
- method min
- method Model
- method pluck
- method sum
- method toString
- method unscoped
- method updateAll
-
class QueryEngineBase
- method _fetchScope
- method _inheritContext
- method _newFieldScope
- method _newModelScope
- method _newQueryEngineScope
- method _pushOperationOntoStack
- method clone
- method constructor
- method filter
- method getAllModelsUsedInQuery
- method getConnection
- method getFieldScopeClass
- method getModel
- method getModelScopeClass
- method getOperationContext
- method getOperationStack
- method getQueryEngineClass
- method getQueryEngineScope
- method getQueryEngineScopeClass
- method getQueryID
- method isLastOperationCondition
- method isLastOperationControl
- method isModelUsedInQuery
- method logQueryOperations
- method map
- method queryHasConditions
- method queryHasJoins
- method static generateID
- method static getQueryOperationInfo
- method static isQuery
- method static isQueryOperationContext
- method walk
-
class QueryGeneratorBase
- method _averageLiteralToString
- method _countLiteralToString
- method _distinctLiteralToString
- method _fieldLiteralToString
- method _maxLiteralToString
- method _minLiteralToString
- method _sumLiteralToString
- method constructor
- method escape
- method escapeID
- method getConnection
- method getFieldDefaultValue
- method getIndexFieldsFromFieldIndex
- method setConnection
- method stackAssign
- method toConnectionString
-
class RealType
- method castToType
- method constructor
- method isValidValue
- method static getDisplayName
- method toString
-
class SerializedType
- method castToType
- method constructor
- method deserialize
- method getOptions
- method initialize
- method isDirty
- method isValidValue
- method onSetFieldValue
- method serialize
- method static getDisplayName
- method toString
-
class StringType
- method castToType
- method constructor
- method isValidValue
- method static getDisplayName
- method toString
-
class SumLiteral
- method static isAggregate
- method toString
-
class TextType
- method castToType
- method constructor
- method isValidValue
- method static getDisplayName
- method toString
-
class Type
- property _isMythixFieldType
- property clone
- method castToType
- method clone
- method constructor
- method deserialize
- method exposeToModel
- method getDisplayName
- method getField
- method getModel
- method initialize
- method isDirty
- method isForeignKey
- method isRelational
- method isRemote
- method isValidValue
- method isVirtual
- method onSetFieldValue
- method serialize
- method setField
- method setModel
- method static instantiateType
- method static isSameType
- method static isType
- method static isTypeClass
- method static wrapConstructor
- method toConnectionType
-
class UUIDV1Type
- property Default
- method castToType
- method getArgsForUUID
- method isValidValue
- method static getDisplayName
- method validateOptions
-
class UUIDV3Type
- property Default
- method castToType
- method getArgsForUUID
- method isValidValue
- method static getDisplayName
- method validateOptions
-
class UUIDV4Type
- property Default
- method castToType
- method getArgsForUUID
- method isValidValue
- method static getDisplayName
- method validateOptions
-
class UUIDV5Type
- property Default
- method castToType
- method getArgsForUUID
- method isValidValue
- method static getDisplayName
- method validateOptions
-
class XIDType
- property Default
- method castToType
- method isValidValue
- method static getDisplayName