BelongsToOneRelateOperation.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. const normalizeIds = require('../../utils/normalizeIds');
  2. const RelateOperation = require('../../queryBuilder/operations/RelateOperation');
  3. class BelongsToOneRelateOperation extends RelateOperation {
  4. onAdd(builder, args) {
  5. this.input = args[0];
  6. this.ids = normalizeIds(args[0], this.relation.relatedProp, { arrayOutput: true });
  7. if (this.ids.length > 1) {
  8. throw this.relation.createError('can only relate one model to a BelongsToOneRelation');
  9. }
  10. return true;
  11. }
  12. queryExecutor(builder) {
  13. const patch = {};
  14. const ownerProp = this.relation.ownerProp;
  15. const idColumn = builder.fullIdColumnFor(this.relation.ownerModelClass);
  16. for (let i = 0, l = ownerProp.size; i < l; ++i) {
  17. const relatedValue = this.ids[0][i];
  18. ownerProp.setProp(this.owner, i, relatedValue);
  19. ownerProp.patch(patch, i, relatedValue);
  20. }
  21. return this.relation.ownerModelClass
  22. .query()
  23. .childQueryOf(builder)
  24. .copyFrom(builder, builder.constructor.WhereSelector)
  25. .patch(patch)
  26. .whereComposite(idColumn, this.owner.$id());
  27. }
  28. }
  29. module.exports = BelongsToOneRelateOperation;