Skip to content

Commit

Permalink
feat(relationships): add create and createMany methods
Browse files Browse the repository at this point in the history
  • Loading branch information
thetutlage committed Jan 12, 2020
1 parent 1fb858d commit e2a662c
Show file tree
Hide file tree
Showing 10 changed files with 470 additions and 5 deletions.
20 changes: 20 additions & 0 deletions adonis-typings/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,16 @@ declare module '@ioc:Adonis/Lucid/Model' {
* Save the related model.
*/
saveMany (model: T[], wrapInTransaction?: boolean): Promise<void>

/**
* Create the related model instance
*/
create (values: ModelObject, wrapInTransaction?: boolean): Promise<T>

/**
* Create many of the related model instance
*/
createMany (values: ModelObject[], wrapInTransaction?: boolean): Promise<T[]>
}

/**
Expand Down Expand Up @@ -354,6 +364,16 @@ declare module '@ioc:Adonis/Lucid/Model' {
*/
saveMany (model: T[], wrapInTransaction?: boolean, checkExisting?: boolean): Promise<void>

/**
* Create the related model instance
*/
create (values: ModelObject, wrapInTransaction?: boolean, checkExisting?: boolean): Promise<T>

/**
* Create many of the related model instance
*/
createMany (values: ModelObject, wrapInTransaction?: boolean, checkExisting?: boolean): Promise<T[]>

/**
* Attach related
*/
Expand Down
3 changes: 3 additions & 0 deletions src/Orm/Relations/Base/QueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import knex from 'knex'

import {
ModelObject,
ModelContract,
RelationContract,
BaseRelationQueryBuilderContract,
Expand Down Expand Up @@ -139,4 +140,6 @@ export abstract class BaseRelationQueryBuilder

public abstract async save (model: ModelContract, wrapInTransaction?: boolean): Promise<void>
public abstract async saveMany (model: ModelContract[], wrapInTransaction?: boolean): Promise<void>
public abstract async create (model: ModelObject, wrapInTransaction?: boolean): Promise<ModelContract>
public abstract async createMany (model: ModelObject[], wrapInTransaction?: boolean): Promise<ModelContract[]>
}
20 changes: 19 additions & 1 deletion src/Orm/Relations/BelongsTo/QueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import knex from 'knex'
import { Exception } from '@poppinss/utils'

import { ModelContract, BelongsToQueryBuilderContract } from '@ioc:Adonis/Lucid/Model'
import { ModelContract, BelongsToQueryBuilderContract, ModelObject } from '@ioc:Adonis/Lucid/Model'
import { QueryClientContract, TransactionClientContract } from '@ioc:Adonis/Lucid/Database'

import { BelongsTo } from './index'
Expand Down Expand Up @@ -151,4 +151,22 @@ export class BelongsToQueryBuilder
public saveMany (): Promise<void> {
throw new Exception(`Cannot save many of ${this._relation.model.name}.${this._relation.relationName}. Use associate instead.`)
}

/**
* Alias for save, since `associate` feels more natural
*/
public async create (values: ModelObject, wrapInTransaction: boolean = true): Promise<any> {
const related = new (this._relation.relatedModel())()
related.fill(values)

await this.save(related, wrapInTransaction)
return related
}

/**
* Create many not allowed for belongsTo
*/
public createMany (): Promise<any> {
throw new Exception(`Cannot create many of ${this._relation.model.name}.${this._relation.relationName}. Use create instead.`)
}
}
27 changes: 26 additions & 1 deletion src/Orm/Relations/HasMany/QueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
/// <reference path="../../../../adonis-typings/index.ts" />

import knex from 'knex'
import { HasManyQueryBuilderContract, ModelContract } from '@ioc:Adonis/Lucid/Model'
import { HasManyQueryBuilderContract, ModelContract, ModelObject } from '@ioc:Adonis/Lucid/Model'
import { QueryClientContract, TransactionClientContract } from '@ioc:Adonis/Lucid/Database'

import { HasMany } from './index'
Expand Down Expand Up @@ -125,4 +125,29 @@ export class HasManyQueryBuilder
return this.$persist(this._parent, related, callback)
}
}

/**
* Create and persist related model instance
*/
public async create (values: ModelObject, wrapInTransaction: boolean = true): Promise<any> {
const related = new (this._relation.relatedModel())()
related.fill(values)
await this.save(related, wrapInTransaction)

return related
}

/**
* Create and persist related model instances
*/
public async createMany (values: ModelObject[], wrapInTransaction: boolean = true): Promise<any> {
const relatedModels = values.map((value) => {
const related = new (this._relation.relatedModel())()
related.fill(value)
return related
})

await this.saveMany(relatedModels, wrapInTransaction)
return relatedModels
}
}
10 changes: 9 additions & 1 deletion src/Orm/Relations/HasManyThrough/QueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,19 @@ export class HasManyThroughQueryBuilder
return this
}

public save (): Promise<void> {
public async save (): Promise<void> {
throw new Exception('Has many through doesn\'t support saving relations')
}

public async saveMany () {
return this.save()
}

public async create (): Promise<any> {
return this.save()
}

public async createMany (): Promise<any> {
return this.save()
}
}
20 changes: 19 additions & 1 deletion src/Orm/Relations/HasOne/QueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@

import knex from 'knex'
import { Exception } from '@poppinss/utils'
import { HasOneQueryBuilderContract, ModelContract } from '@ioc:Adonis/Lucid/Model'
import { QueryClientContract, TransactionClientContract } from '@ioc:Adonis/Lucid/Database'
import { HasOneQueryBuilderContract, ModelContract, ModelObject } from '@ioc:Adonis/Lucid/Model'

import { HasOne } from './index'
import { unique } from '../../../utils'
Expand Down Expand Up @@ -103,10 +103,28 @@ export class HasOneQueryBuilder extends BaseRelationQueryBuilder implements HasO
}
}

/**
* Create and persist related model instance
*/
public async create (values: ModelObject, wrapInTransaction: boolean = true): Promise<any> {
const related = new (this._relation.relatedModel())()
related.fill(values)
await this.save(related, wrapInTransaction)

return related
}

/**
* Save many is not allowed by HasOne
*/
public saveMany (): Promise<void> {
throw new Exception(`Cannot save many of ${this._relation.model.name}.${this._relation.relationName}. Use save instead.`)
}

/**
* Save many is not allowed by HasOne
*/
public createMany (): Promise<any> {
throw new Exception(`Cannot create many of ${this._relation.model.name}.${this._relation.relationName}. Use create instead.`)
}
}
35 changes: 34 additions & 1 deletion src/Orm/Relations/ManyToMany/QueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
/// <reference path="../../../../adonis-typings/index.ts" />

import knex from 'knex'
import { ModelContract, ManyToManyQueryBuilderContract } from '@ioc:Adonis/Lucid/Model'
import { ModelContract, ManyToManyQueryBuilderContract, ModelObject } from '@ioc:Adonis/Lucid/Model'
import { QueryClientContract, TransactionClientContract } from '@ioc:Adonis/Lucid/Database'

import { ManyToMany } from './index'
Expand Down Expand Up @@ -627,4 +627,37 @@ export class ManyToManyQueryBuilder
await this._sync(this._parent, ids, checkExisting)
}
}

/**
* Create and persist related model instance
*/
public async create (
values: ModelObject,
wrapInTransaction: boolean = true,
checkExisting: boolean = true,
): Promise<any> {
const related = new (this._relation.relatedModel())()
related.fill(values)
await this.save(related, wrapInTransaction, checkExisting)

return related
}

/**
* Create and persist related model instances
*/
public async createMany (
values: ModelObject[],
wrapInTransaction: boolean = true,
checkExisting: boolean = true,
): Promise<any> {
const relatedModels = values.map((value) => {
const related = new (this._relation.relatedModel())()
related.fill(value)
return related
})

await this.saveMany(relatedModels, wrapInTransaction, checkExisting)
return relatedModels
}
}
Loading

0 comments on commit e2a662c

Please sign in to comment.