diff --git a/src/builder.js b/src/builder.js index 36c5c1c..00f746f 100644 --- a/src/builder.js +++ b/src/builder.js @@ -583,25 +583,27 @@ class ManageSQLBuilder extends Builder { } createForeignKey(options) { - options.reference.onDelete = options.reference.onDelete ? options.reference.onDelete.toUpperCase() : 'NO ACTION'; - options.reference.onUpdate = options.reference.onUpdate ? options.reference.onUpdate.toUpperCase() : 'NO ACTION'; + if (options.references) { + options.references.onDelete = options.references.onDelete ? options.references.onDelete.toUpperCase() : 'NO ACTION'; + options.references.onUpdate = options.references.onUpdate ? options.references.onUpdate.toUpperCase() : 'NO ACTION'; + } _validate(options, { name: 'required|string', table: 'required|string', column: 'required|string', - 'reference.tableName': 'required|string', - 'reference.columnName': 'required|string', - 'reference.onUpdate': [{ in: ['RESTRICT', 'CASCADE', 'SET NULL', 'NO ACTION'] }], - 'reference.onDelete': [{ in: ['RESTRICT', 'CASCADE', 'SET NULL', 'NO ACTION'] }] + 'references.tableName': 'required|string', + 'references.columnName': 'required|string', + 'references.onUpdate': [{ in: ['RESTRICT', 'CASCADE', 'SET NULL', 'NO ACTION'] }], + 'references.onDelete': [{ in: ['RESTRICT', 'CASCADE', 'SET NULL', 'NO ACTION'] }] }); return _render('ALTER TABLE `${table_name}` ADD CONSTRAINT `${name}` FOREIGN KEY (`${column_name}`) REFERENCES `${foreign_table}` (`${foreign_column}`) ON DELETE ${on_delete} ON UPDATE ${on_update}', { table_name: options.tableName, name: options.name, column_name: options.columnName, - foreign_table: options.reference.tableName, - foreign_column: options.reference.columnName, - on_delete: options.reference.onDelete || 'NO ACTION', - on_update: options.reference.onUpdate || 'NO ACTION', + foreign_table: options.references.tableName, + foreign_column: options.references.columnName, + on_delete: options.references.onDelete || 'NO ACTION', + on_update: options.references.onUpdate || 'NO ACTION', }); } @@ -657,11 +659,14 @@ class ManageSQLBuilder extends Builder { } else if (column.uniqIndex === true) { indexColumns.push(column); } - if (column.reference) { - column.reference.onDelete = column.reference.onDelete ? column.reference.onDelete.toUpperCase() : 'NO ACTION'; - column.reference.onUpdate = column.reference.onUpdate ? column.reference.onUpdate.toUpperCase() : 'NO ACTION'; + if (column.reference && !column.references) { + column.references = column.reference; + } + if (column.references) { + column.references.onDelete = column.references.onDelete ? column.references.onDelete.toUpperCase() : 'NO ACTION'; + column.references.onUpdate = column.references.onUpdate ? column.references.onUpdate.toUpperCase() : 'NO ACTION'; - _validate(column.reference, { + _validate(column.references, { table: 'required|string', column: 'required|string', onDelete: [{ in: ['RESTRICT', 'CASCADE', 'SET NULL', 'NO ACTION'] }], @@ -671,11 +676,11 @@ class ManageSQLBuilder extends Builder { name: 'fk_' + table + '_' + column.name, table, column: column.name, - reference: { - tableName: column.reference.table, - columnName: column.reference.column, - onDelete: column.reference.onDelete, - onUpdate: column.reference.onUpdate + references: { + tableName: column.references.table, + columnName: column.references.column, + onDelete: column.references.onDelete, + onUpdate: column.references.onUpdate } }); } diff --git a/src/migration.js b/src/migration.js index 8bb1f0d..a6c53e5 100644 --- a/src/migration.js +++ b/src/migration.js @@ -233,7 +233,7 @@ function _initMigration(file, queries = {}) { name: options.foreignKey ? options.foreignKey : 'fk_' + table + '_' + options.columnName, table: table, column: options.columnName, - reference: options.reference + references: options.references || options.reference // 兼容性处理 }); const builder = new ManageSQLBuilder(options); queries[file].push({ sql: builder.sql, values: builder.values }); diff --git a/tests/builder.tests.js b/tests/builder.tests.js index 216e897..74e7650 100644 --- a/tests/builder.tests.js +++ b/tests/builder.tests.js @@ -949,7 +949,7 @@ describe('builder test case', () => { }, user_id: { type: 'int', - reference: { + references: { table: 'users', column: 'id', onDelete: 'CASCADE', @@ -976,7 +976,7 @@ describe('builder test case', () => { }, user_id: { type: 'int', - reference: { + references: { table: 'users', column: 'id' } @@ -987,5 +987,32 @@ describe('builder test case', () => { expect(sql).to.include('ON DELETE NO ACTION'); expect(sql).to.include('ON UPDATE NO ACTION'); }); + + it('should handle createColumns with legacy reference property', () => { + const options = { + operator: 'create', + target: 'table', + name: 'test_table', + columns: { + id: { + type: 'int', + primaryKey: true + }, + user_id: { + type: 'int', + reference: { + table: 'users', + column: 'id', + onDelete: 'CASCADE', + onUpdate: 'RESTRICT' + } + } + } + }; + const sql = (new ManageSQLBuilder(options)).sql; + expect(sql).to.include('FOREIGN KEY'); + expect(sql).to.include('ON DELETE CASCADE'); + expect(sql).to.include('ON UPDATE RESTRICT'); + }); }); });