333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
{"version":3,"sources":["../browser/src/query-builder/RelationUpdater.ts"],"names":[],"mappings":"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","file":"RelationUpdater.js","sourcesContent":["import {QueryBuilder} from \"./QueryBuilder\";\nimport {ObjectLiteral} from \"../common/ObjectLiteral\";\nimport {QueryExpressionMap} from \"./QueryExpressionMap\";\nimport {OracleDriver} from \"../driver/oracle/OracleDriver\";\n\n/**\n * Allows to work with entity relations and perform specific operations with those relations.\n *\n * todo: add transactions everywhere\n */\nexport class RelationUpdater {\n\n    // -------------------------------------------------------------------------\n    // Constructor\n    // -------------------------------------------------------------------------\n\n    constructor(protected queryBuilder: QueryBuilder<any>,\n                protected expressionMap: QueryExpressionMap) {\n    }\n\n    // -------------------------------------------------------------------------\n    // Public Methods\n    // -------------------------------------------------------------------------\n\n    /**\n     * Performs set or add operation on a relation.\n     */\n    async update(value: any|any[]): Promise<void> {\n        const relation = this.expressionMap.relationMetadata;\n\n        if (relation.isManyToOne || relation.isOneToOneOwner) {\n\n            const updateSet = relation.joinColumns.reduce((updateSet, joinColumn) => {\n                const relationValue = value instanceof Object ? joinColumn.referencedColumn!.getEntityValue(value) : value;\n                joinColumn.setEntityValue(updateSet, relationValue);\n                return updateSet;\n            }, {} as any);\n\n            if (!this.expressionMap.of || (this.expressionMap.of instanceof Array && !this.expressionMap.of.length)) return;\n\n            await this.queryBuilder\n                .createQueryBuilder()\n                .update(relation.entityMetadata.target)\n                .set(updateSet)\n                .whereInIds(this.expressionMap.of)\n                .execute();\n\n        } else if ((relation.isOneToOneNotOwner || relation.isOneToMany) && value === null) { // we handle null a bit different way\n\n            const updateSet: ObjectLiteral = {};\n            relation.inverseRelation!.joinColumns.forEach(column => {\n                updateSet[column.propertyName] = null;\n            });\n\n            const ofs = this.expressionMap.of instanceof Array ? this.expressionMap.of : [this.expressionMap.of];\n            const parameters: ObjectLiteral = {};\n            const conditions: string[] = [];\n            ofs.forEach((of, ofIndex) => {\n                relation.inverseRelation!.joinColumns.map((column, columnIndex) => {\n                    const parameterName = \"joinColumn_\" + ofIndex + \"_\" + columnIndex;\n                    parameters[parameterName] = of instanceof Object ? column.referencedColumn!.getEntityValue(of) : of;\n                    conditions.push(`${column.propertyPath} = :${parameterName}`);\n                });\n            });\n            const condition = conditions.map(str => \"(\" + str + \")\").join(\" OR \");\n            if (!condition) return;\n\n            await this.queryBuilder\n                .createQueryBuilder()\n                .update(relation.inverseEntityMetadata.target)\n                .set(updateSet)\n                .where(condition)\n                .setParameters(parameters)\n                .execute();\n\n        } else if (relation.isOneToOneNotOwner || relation.isOneToMany) {\n\n            if (this.expressionMap.of instanceof Array)\n                throw new Error(`You cannot update relations of multiple entities with the same related object. Provide a single entity into .of method.`);\n\n            const of = this.expressionMap.of;\n            const updateSet = relation.inverseRelation!.joinColumns.reduce((updateSet, joinColumn) => {\n                const relationValue = of instanceof Object ? joinColumn.referencedColumn!.getEntityValue(of) : of;\n                joinColumn.setEntityValue(updateSet, relationValue);\n                return updateSet;\n            }, {} as any);\n\n            if (!value || (value instanceof Array && !value.length)) return;\n\n            await this.queryBuilder\n                .createQueryBuilder()\n                .update(relation.inverseEntityMetadata.target)\n                .set(updateSet)\n                .whereInIds(value)\n                .execute();\n\n        } else { // many to many\n            const junctionMetadata = relation.junctionEntityMetadata!;\n            const ofs = this.expressionMap.of instanceof Array ? this.expressionMap.of : [this.expressionMap.of];\n            const values = value instanceof Array ? value : [value];\n            const firstColumnValues = relation.isManyToManyOwner ? ofs : values;\n            const secondColumnValues = relation.isManyToManyOwner ? values : ofs;\n\n            const bulkInserted: ObjectLiteral[] = [];\n            firstColumnValues.forEach(firstColumnVal => {\n                secondColumnValues.forEach(secondColumnVal => {\n                    const inserted: ObjectLiteral = {};\n                    junctionMetadata.ownerColumns.forEach(column => {\n                        inserted[column.databaseName] = firstColumnVal instanceof Object ? column.referencedColumn!.getEntityValue(firstColumnVal) : firstColumnVal;\n                    });\n                    junctionMetadata.inverseColumns.forEach(column => {\n                        inserted[column.databaseName] = secondColumnVal instanceof Object ? column.referencedColumn!.getEntityValue(secondColumnVal) : secondColumnVal;\n                    });\n                    bulkInserted.push(inserted);\n                });\n            });\n\n            if (!bulkInserted.length) return;\n\n            if (this.queryBuilder.connection.driver instanceof  OracleDriver) {\n                await Promise.all(bulkInserted.map(value => {\n                    return this.queryBuilder\n                        .createQueryBuilder()\n                        .insert()\n                        .into(junctionMetadata.tableName)\n                        .values(value)\n                        .execute();\n                }));\n            } else {\n                await this.queryBuilder\n                    .createQueryBuilder()\n                    .insert()\n                    .into(junctionMetadata.tableName)\n                    .values(bulkInserted)\n                    .execute();\n            }\n        }\n    }\n\n}"],"sourceRoot":".."}