diff --git a/forward_engineering/ddlProvider.js b/forward_engineering/ddlProvider.js index 74f21af2..6b303860 100644 --- a/forward_engineering/ddlProvider.js +++ b/forward_engineering/ddlProvider.js @@ -31,6 +31,7 @@ module.exports = (baseProvider, options, app) => { getTempTableTime, foreignActiveKeysToString, additionalPropertiesForForeignKey, + getFKConstraintName, } = require('./helpers/general')(app); const keyHelper = require('./helpers/keyHelper')(app); const { getTerminator } = require('./helpers/optionsHelper'); @@ -285,12 +286,21 @@ module.exports = (baseProvider, options, app) => { primaryTableActivated && foreignTableActivated; + const relationshipName = + name || + getFKConstraintName({ + primaryTableName: primaryTable, + foreignTableName: '', + primaryTableColumns: primaryKey, + foreignTableColumns: foreignKey, + }); + const { foreignOnDelete, foreignOnUpdate } = additionalPropertiesForForeignKey(customProperties); return { statement: assignTemplates(templates.createForeignKeyConstraint, { primaryTable: getTableName(primaryTable, primarySchemaName || schemaData.schemaName, true), - name: wrapInBrackets(name), + name: wrapInBrackets(relationshipName), foreignKey: isActivated ? foreignKeysToString(foreignKey) : foreignActiveKeysToString(foreignKey), primaryKey: isActivated ? foreignKeysToString(primaryKey) : foreignActiveKeysToString(primaryKey), onDelete: foreignOnDelete ? ` ON DELETE ${foreignOnDelete}` : '', @@ -320,11 +330,20 @@ module.exports = (baseProvider, options, app) => { const { foreignOnDelete, foreignOnUpdate } = additionalPropertiesForForeignKey(customProperties); + const relationshipName = + name || + getFKConstraintName({ + primaryTableName: primaryTable, + foreignTableName: foreignTable, + primaryTableColumns: primaryKey, + foreignTableColumns: foreignKey, + }); + return { statement: assignTemplates(templates.createForeignKey, { primaryTable: getTableName(primaryTable, schemaData.schemaName, true), foreignTable: getTableName(foreignTable, schemaData.schemaName, true), - name: wrapInBrackets(name), + name: wrapInBrackets(relationshipName), foreignKey: foreignKeysToString(foreignKey), primaryKey: foreignKeysToString(primaryKey), onDelete: foreignOnDelete ? ` ON DELETE ${foreignOnDelete}` : '', diff --git a/forward_engineering/helpers/alterScriptHelpers/alterRelationshipsHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterRelationshipsHelper.js index adcb87cf..3fdbe175 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterRelationshipsHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterRelationshipsHelper.js @@ -63,7 +63,6 @@ const canRelationshipBeAdded = relationship => { return false; } return [ - compMod.name?.new || getRelationshipName(relationship), compMod.parent?.bucket, compMod.parent?.collection, compMod.parent?.collection?.fkFields?.length, diff --git a/forward_engineering/helpers/general.js b/forward_engineering/helpers/general.js index 13a4d9e8..257973fd 100644 --- a/forward_engineering/helpers/general.js +++ b/forward_engineering/helpers/general.js @@ -251,6 +251,20 @@ module.exports = app => { return ''; }; + /** + * @param {Object} params + * @param {string} params.primaryTableName + * @param {string} params.foreignTableName + * @param {Array} params.primaryTableColumns + * @param {Array} params.foreignTableColumns + * @returns {string} + */ + const getFKConstraintName = ({ primaryTableName, foreignTableName, primaryTableColumns, foreignTableColumns }) => { + return sanitizeConstraintName( + `FK_${[primaryTableName, foreignTableColumns.map(k => k.name).join('_'), foreignTableName, primaryTableColumns.map(k => k.name).join('_')].filter(Boolean).join('_')}`, + ); + }; + return { filterColumnStoreProperties, getKeyWithAlias, @@ -266,5 +280,6 @@ module.exports = app => { foreignActiveKeysToString, getDefaultValue, getTempTableTime, + getFKConstraintName, }; };