Defining relations
To use relations you must extend BaseModel
class and add static relations
property
import { BaseModel } from 'mobx-model';
class Post extends BaseModel
static relations = [
{
type: 'hasMany',
relatedModel: 'Comments'
}
]
end
Relation config options
Note that if config option has a default it can be ommitted when declaring relations. Note that defaults are dynamic, so that you can incrementally override defautls as you need.
option | type | default | description |
---|---|---|---|
type |
string |
Can be hasOne or hasMany . An observable property defined by propertyName will be added to instance of model. If relation is hasMany an observable array will be added |
|
relatedModel |
string |
Name of the model that will be supplied to getModel method to get related model class. We need this due to circular dependency problem when models refer to each other |
|
propertyName |
string |
relatedModel with lowercased first letter for hasOne and is further pluralized for hasMany |
Name of the property that will be set on model instance. For example if model is Post and relatedModel is BestComment then when relation is hasOne propertyName defaults to bestComment . When relation is hasMany it defaults to bestComments and can be later accessed with post.bestComments |
jsonKey |
string |
uderscored propertyName |
Is used to get relation json from provided model json. When propertyName is bestComments relation json by default is expected to be under best_comments key, and when propertyName is bestComment then it defaults to best_comment |
topLevelJsonKey |
string |
tableized propertyName |
Is used to get relation json from normalized array of objects in top level. if propertyName is bestComments than by default top level json must have best_comments key that is an array of objects |
foreignKey |
string |
foreign key derived from propertyName |
Used to look up relation ids in model json, that later will be used to find relation json in top level defined by topLevelJsonKey . If propertyName is bestComment and relation type is hasOne then foreignKey defaults to best_comment_id . If propertyName is bestComments and relation type is hasMany then foreignKey defaults to best_comment_ids |
setMethodName |
string |
set + singularized propertyName with uppercased first letter |
Name of the instance method to set related model, for Post that hasMany Comment it will default to setComment |
removeMethodName |
string |
remove + singularized propertyName with uppercased first letter |
Name of the instance method to remove related model, for Post that hasMany Comment it will default to removeComment |
reverseRelation |
boolean or object |
false |
If set to true or to an object then related model will have a property defined by reverseRelation.propertyName be set to this model instance. E.g. Post that hasMany Comment and reverseRelation: true will make comment.post available if Post relation is also set for Comment as hasOne relation |
Reverse relation config options
option | type | default | description |
---|---|---|---|
onDestroy |
string |
removeSelf |
Can be removeSelf or destroyRelation . Defines what needs to be done when relation is destroyed. When option is removeSelf this model will be removed from reverse relation, e.g. a comment will be removed from list of comments for a post. When it is set to destroyRelation then related model will be destroyed when this model is destroyed, e.g. when deleting a post we can delete all related comments. |
propertyName |
string |
this model's name with lowercased first letter | {roperty name to set or remove on reverse relation. If Post has Comment then defaulP reverseRelation.propertyName will be post . Note that it should be singular even for hasMany relations |
setMethodName |
string |
set + reverseRelation.propertyName with uppercased first letter |
Instance method name on related model to set reverse relation. For Post that hasMany Comment it will default to setPost |
removeMethodName |
string |
remove + reverseRelation.propertyName with uppercased first letter |
Instance method name on related model to remove reverse relation. For Post that hasMany Comment it will default to removePost |