ManyToManyRelateOperation.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. const normalizeIds = require('../../../utils/normalizeIds');
  2. const RelateOperation = require('../../../queryBuilder/operations/RelateOperation');
  3. class ManyToManyRelateOperation extends RelateOperation {
  4. onAdd(builder, args) {
  5. this.input = args[0];
  6. this.ids = normalizeIds(args[0], this.relation.relatedProp);
  7. return true;
  8. }
  9. queryExecutor(builder) {
  10. const ownerId = this.relation.ownerProp.getProps(this.owner);
  11. const joinModels = this.relation.createJoinModels(ownerId, this.ids);
  12. const joinModelClass = this.relation.getJoinModelClass(builder.knex());
  13. for (let i = 0, l = joinModels.length; i < l; ++i) {
  14. joinModels[i] = joinModelClass.fromJson(joinModels[i]);
  15. }
  16. return joinModelClass
  17. .query()
  18. .childQueryOf(builder)
  19. .runBefore((result, builder) =>
  20. this.relation.executeJoinTableBeforeInsert(joinModels, builder.context(), null)
  21. )
  22. .insert(joinModels)
  23. .copyFrom(builder, /returning/)
  24. .runAfter(models => {
  25. if (Array.isArray(this.input)) {
  26. return models;
  27. } else {
  28. return models[0];
  29. }
  30. });
  31. }
  32. }
  33. module.exports = ManyToManyRelateOperation;