1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- const QueryBuilderOperation = require('./QueryBuilderOperation');
- const RelationJoinBuilder = require('./eager/RelationJoinBuilder');
- const RelationExpression = require('../RelationExpression');
- class JoinRelationOperation extends QueryBuilderOperation {
- constructor(name, opt) {
- super(name, opt);
- this.expression = null;
- this.callOpt = null;
- }
- onAdd(builder, args) {
- this.expression = RelationExpression.create(args[0]);
- this.callOpt = args[1] || {};
- return true;
- }
- onBuild(builder) {
- const modelClass = builder.modelClass();
- const opt = Object.assign({}, this.callOpt);
- opt.aliases = Object.assign({}, opt.aliases);
- opt.joinOperation = this.opt.joinOperation;
- // Special case for one single relation.
- if (this.expression.numChildren === 1) {
- const relationNames = this.expression.childNames.map(it => this.expression[it].$relation);
- const relationName = relationNames[0];
- const relation = modelClass.getRelation(relationName);
- let alias = null;
- if (opt.alias === false) {
- alias = builder.tableRefFor(relation.relatedModelClass);
- } else if (opt.alias === true || !opt.alias) {
- alias = relation.name;
- } else if (typeof opt.alias === 'string') {
- alias = opt.alias;
- }
- if (alias) {
- opt.aliases[relationName] = alias;
- }
- }
- const joinBuilder = new RelationJoinBuilder({
- modelClass,
- expression: this.expression
- });
- joinBuilder.setOptions(opt);
- joinBuilder.buildJoinOnly(builder);
- }
- }
- module.exports = JoinRelationOperation;
|