UNPKG

@dazejs/framework

Version:

Daze.js - A powerful web framework for Node.js

103 lines 4.86 kB
"use strict"; 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