ManyToManyInsertOperation.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const RelationInsertOperation = require('../../RelationInsertOperation');
  2. const { after } = require('../../../utils/promiseUtils');
  3. class ManyToManyInsertOperation extends RelationInsertOperation {
  4. onAdd(builder, args) {
  5. const retVal = super.onAdd(builder, args);
  6. this.relation.omitExtraProps(this.models);
  7. return retVal;
  8. }
  9. onAfter1(builder, ret) {
  10. const maybePromise = super.onAfter1(builder, ret);
  11. const owner = this.owner;
  12. return after(maybePromise, inserted => {
  13. const ownerId = this.relation.ownerProp.getProps(owner);
  14. const joinModels = this.relation.createJoinModels(ownerId, inserted);
  15. const joinModelClass = this.relation.getJoinModelClass(builder.knex());
  16. for (let i = 0, l = joinModels.length; i < l; ++i) {
  17. joinModels[i] = joinModelClass.fromJson(joinModels[i]);
  18. }
  19. if (this.assignResultToOwner) {
  20. owner.$appendRelated(this.relation, inserted);
  21. }
  22. // Insert the join rows to the join table.
  23. return joinModelClass
  24. .query()
  25. .childQueryOf(builder)
  26. .runBefore((result, builder) =>
  27. this.relation.executeJoinTableBeforeInsert(joinModels, builder.context(), null)
  28. )
  29. .insert(joinModels)
  30. .return(inserted);
  31. });
  32. }
  33. }
  34. module.exports = ManyToManyInsertOperation;