@disco/has-many v1.0.0
@disco/has-many
This is a middleware for disco to add has-many relation support.
Install
npm install @disco/has-many
Usage
const disco = require('@disco/disco')
const hasMany = require('@disco/has-many')
const modeller = disco(driver)
modeller.use(hasMany)
const User = modeller.createModel('user')
const Post = modeller.createModel('post')
User.hasMany({
model: Post,
as: 'posts'
})
const user = await User.findOne({})
for await (const post of user.posts) {
console.log(post)
}
HasMany API
Model.hasMany(config : Object)
This is the entrypoint to create a hasMany relation on a given model.
config
{Object} config objectmodel
{Model} Model this has many ofas
{String} Name of relation property (default: model.tableName)foreignKey
{String} Column name of foreign key (default: Model.tableName)immutable
{Boolean} If it should exclude mutation APIs (default: false)
User.hasMany({
model: Post,
as: 'posts'
})
const user = User.findOne({})
user.posts // User.hasMany(...) added this relation property
Note that while a relation can be set to immutable
, this currently only makes the relation immutable and not any of the models returned by it.
Non-mutating
These APIs will always be included regardless of if immutable
has been set to false
.
relation[Symbol.asyncIterator]() : AsyncIterator\
Relations are async iterable so they can be used in for-await loops.
for await (const post of user.posts) {
// ...
}
relation.find(query : Object) : Promise<Array\>
Find many related records by the given query.
const posts = await user.posts.find({
title: 'test post'
})
relation.findIterator(query : Object) : AsyncIterator\
Find many related records by the given query.
const posts = user.posts.findIterator({
title: 'test post'
})
for await (const post of posts) {
// ..
}
relation.findOne(query : Object) : Promise\
Find a related record by the given query.
const post = await user.posts.findOne({
title: 'test post'
})
relation.findById(id : ID) : Promise\
Find a related record by the given id.
const post = await user.posts.findById(1)
relation.count(query : Object) : Promise\
Count related records matching the given query.
const count = await user.posts.count({
title: 'test post'
})
Mutating
If immutable
has been set to false
in Model.hasMany(...)
, these APIs will not be included.
relation.build(data : Object) : Model
Build a new related record. This will not persist until the returned model is saved.
const post = user.posts.build({
title: 'test post'
})
await post.save()
relation.create(data : Object) : Promise\
Create a new related record. This will persist before returning the model.
const post = await user.posts.create({
title: 'test post'
})
relation.add(model : Model) : Promise\
Add an existing model to this relation.
const post = Post.build({
title: 'test post'
})
await user.posts.add(post)
relation.findOrCreate(query : Object, data : Object) : Promise\
Attempt to find a related record by the given query
, creating it with the given data
if not found.
const post = await user.posts.findOrCreate({
title: 'test post'
}, {
title: 'better title'
})
relation.createOrUpdate(query : Object, changes : Object) : Promise\
Attempt to update a related record found by the given query
by applying the given changes
, creating it with the changes
if not found.
const post = await user.posts.createOrUpdate({
title: 'test post'
}, {
title: 'better title'
})
relation.update(query : Object, changes : Object) : Promise<Array\>
Update any related records found by the given query
by applying the given changes
.
const posts = await user.posts.update({
title: 'test post'
}, {
title: 'better title'
})
relation.updateIterator(query : Object, changes : Object) : AsyncIterator\
Update any related records found by the given query
by applying the given changes
.
const posts = user.posts.update({
title: 'test post'
}, {
title: 'better title'
})
for await (const post of posts) {
// ...
}
relation.updateById(id : ID, changes : Object) : Promise\
Update a related record by id
by applying the given changes
.
const post = await user.posts.updateById(1, {
title: 'better title'
})
relation.remove(query : Object) : Promise<Array\>
Remove related records by the given query
.
const removedPosts = await user.posts.remove({
title: 'better title'
})
relation.removeIterator(query : Object) : AsyncIterator\
Remove related records by the given query
.
const removedPosts = user.posts.remove({
title: 'better title'
})
for await (const post of removedPosts) {
// ..
}
relation.removeById(id : ID) : Promise\
Remove a related record by id
.
const removedPost = await user.posts.removeById(1)
4 years ago