@dazejs/framework
Version:
Daze.js - A powerful web framework for Node.js
103 lines • 4.86 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BelongsToMany = void 0;
const pluralize_1 = __importDefault(require("pluralize"));
const model_1 = require("../model");
const pivot_model_1 = require("../pivot-model");
const has_relations_abstract_1 = require("./has-relations.abstract");
class BelongsToMany extends has_relations_abstract_1.HasRelations {
constructor(parent, model, Pivot, foreignPivotKey, relatedPivotKey) {
super();
this.parent = parent;
this.model = model;
this.foreignPivotKey = foreignPivotKey !== null && foreignPivotKey !== void 0 ? foreignPivotKey : this.getDefaultForeignPivotKey();
this.relatedPivotKey = relatedPivotKey !== null && relatedPivotKey !== void 0 ? relatedPivotKey : this.getDefaultRelatedPivotKey();
this.pivot = this.newPivot(Pivot);
}
getDefaultForeignPivotKey() {
return `${pluralize_1.default.singular(this.parent.getTable())}_${this.parent.getPrimaryKey()}`;
}
getDefaultRelatedPivotKey() {
return `${pluralize_1.default.singular(this.model.getTable())}_${this.model.getPrimaryKey()}`;
}
newPivot(Pivot) {
var _a;
const _class = Pivot !== null && Pivot !== void 0 ? Pivot : pivot_model_1.PivotEntity;
const _pivot = new model_1.Model(_class);
const table = (_a = _pivot.getTable()) !== null && _a !== void 0 ? _a : `${pluralize_1.default.singular(this.parent.getTable())}_${pluralize_1.default.singular(this.model.getTable())}`;
_pivot.setTable(`${table} as pivot`);
return _pivot;
}
async eagerly(resultRepos, relation, queryCallback) {
const foreignPivotKey = this.foreignPivotKey;
const relatedPivotKey = this.relatedPivotKey;
const pk = resultRepos.getPrimaryValue();
const model = this.model.createRepository();
const [currentRelation, ...restRelation] = relation.split('.');
if (restRelation.length) {
model.with(restRelation.join('.'));
}
const query = model.createQueryBuilder();
if (queryCallback)
queryCallback(query);
const records = await query
.getBuilder()
.columns([...this.model.getColumns().keys()], `pivot.${relatedPivotKey}`, `pivot.${foreignPivotKey}`)
.alias('relate')
.join((join) => {
return join.table(this.pivot.getTable(), 'pivot')
.on(`pivot.${relatedPivotKey}`, `relate.${this.model.getPrimaryKey()}`)
.where(`pivot.${foreignPivotKey}`, '=', pk);
}).find();
if (records) {
resultRepos.setAttribute(currentRelation, await this.model.resultToRepositories(model, records));
}
}
async eagerlyMap(resultReposes, relation, queryCallback) {
const foreignPivotKey = this.foreignPivotKey;
const relatedPivotKey = this.relatedPivotKey;
const range = new Set();
for (const repos of resultReposes) {
const id = repos.getPrimaryValue();
id && range.add(id);
}
if (range.size > 0) {
const model = this.model.createRepository();
const [currentRelation, ...restRelation] = relation.split('.');
if (restRelation.length) {
model.with(restRelation.join('.'));
}
const query = model.createQueryBuilder();
if (queryCallback)
queryCallback(query);
const records = await query
.getBuilder()
.columns([...this.model.getColumns().keys()], `pivot.${relatedPivotKey}`, `pivot.${foreignPivotKey}`)
.alias('relate')
.join((join) => {
return join.table(this.pivot.getTable(), 'pivot')
.on(`pivot.${relatedPivotKey}`, `relate.${this.model.getPrimaryKey()}`)
.whereIn(`pivot.${foreignPivotKey}`, [...range]);
}).find();
const map = new Map();
for (const record of records) {
const items = map.get(record[foreignPivotKey]) || [];
if (items && Array.isArray(items)) {
items.push(record);
}
map.set(record[foreignPivotKey], items);
}
for (const repos of resultReposes) {
const items = map.get(repos.getPrimaryValue());
if (items) {
repos.setAttribute(currentRelation, await this.model.resultToRepositories(model, items));
}
}
}
}
}
exports.BelongsToMany = BelongsToMany;
//# sourceMappingURL=belongs-to-many.js.map