diff --git a/packages/nocodb/src/services/columns.service.ts b/packages/nocodb/src/services/columns.service.ts index 34d7655944..bd34aa95ce 100644 --- a/packages/nocodb/src/services/columns.service.ts +++ b/packages/nocodb/src/services/columns.service.ts @@ -2179,9 +2179,11 @@ export class ColumnsService { colOpt.type === 'mm' && colOpt.fk_parent_column_id === childColumn.id && colOpt.fk_child_column_id === parentColumn.id && - colOpt.fk_mm_model_id === mmTable.id && - colOpt.fk_mm_parent_column_id === mmChildCol.id && - colOpt.fk_mm_child_column_id === mmParentCol.id + colOpt.fk_mm_model_id === relationColOpt.fk_mm_model_id && + colOpt.fk_mm_parent_column_id === + relationColOpt.fk_mm_child_column_id && + colOpt.fk_mm_child_column_id === + relationColOpt.fk_mm_parent_column_id ) { await Column.delete(c.id, ncMeta); break; @@ -2190,14 +2192,16 @@ export class ColumnsService { await Column.delete(relationColOpt.fk_column_id, ncMeta); - // delete bt columns in m2m table - await mmTable.getColumns(ncMeta); - for (const c of mmTable.columns) { - if (!isLinksOrLTAR(c.uidt)) continue; - const colOpt = - await c.getColOptions(ncMeta); - if (colOpt.type === 'bt') { - await Column.delete(c.id, ncMeta); + if (mmTable) { + // delete bt columns in m2m table + await mmTable.getColumns(ncMeta); + for (const c of mmTable.columns) { + if (!isLinksOrLTAR(c.uidt)) continue; + const colOpt = + await c.getColOptions(ncMeta); + if (colOpt.type === 'bt') { + await Column.delete(c.id, ncMeta); + } } } @@ -2207,7 +2211,9 @@ export class ColumnsService { if (!isLinksOrLTAR(c.uidt)) continue; const colOpt = await c.getColOptions(ncMeta); - if (colOpt.fk_related_model_id === mmTable.id) { + if ( + colOpt.fk_related_model_id === relationColOpt.fk_mm_model_id + ) { await Column.delete(c.id, ncMeta); } } @@ -2218,20 +2224,24 @@ export class ColumnsService { if (!isLinksOrLTAR(c.uidt)) continue; const colOpt = await c.getColOptions(ncMeta); - if (colOpt.fk_related_model_id === mmTable.id) { + if ( + colOpt.fk_related_model_id === relationColOpt.fk_mm_model_id + ) { await Column.delete(c.id, ncMeta); } } - // retrieve columns in m2m table again - await mmTable.getColumns(ncMeta); + if (mmTable) { + // retrieve columns in m2m table again + await mmTable.getColumns(ncMeta); - // ignore deleting table if it has more than 2 columns - // the expected 2 columns would be table1_id & table2_id - if (mmTable.columns.length === 2) { - (mmTable as any).tn = mmTable.table_name; - await sqlMgr.sqlOpPlus(source, 'tableDelete', mmTable); - await mmTable.delete(ncMeta); + // ignore deleting table if it has more than 2 columns + // the expected 2 columns would be table1_id & table2_id + if (mmTable.columns.length === 2) { + (mmTable as any).tn = mmTable.table_name; + await sqlMgr.sqlOpPlus(source, 'tableDelete', mmTable); + await mmTable.delete(ncMeta); + } } } break; @@ -2341,42 +2351,44 @@ export class ColumnsService { }, ignoreFkDelete = false, ) => { - let foreignKeyName; - - // if relationColOpt is not provided, extract it from child table - // and get the foreign key name for dropping the foreign key - if (!relationColOpt) { - foreignKeyName = ( - ( - await childTable.getColumns(ncMeta).then(async (cols) => { - for (const col of cols) { - if (col.uidt === UITypes.LinkToAnotherRecord) { - const colOptions = - await col.getColOptions(ncMeta); - if (colOptions.fk_related_model_id === parentTable.id) { - return { colOptions }; + if (childTable) { + let foreignKeyName; + + // if relationColOpt is not provided, extract it from child table + // and get the foreign key name for dropping the foreign key + if (!relationColOpt) { + foreignKeyName = ( + ( + await childTable.getColumns(ncMeta).then(async (cols) => { + for (const col of cols) { + if (col.uidt === UITypes.LinkToAnotherRecord) { + const colOptions = + await col.getColOptions(ncMeta); + if (colOptions.fk_related_model_id === parentTable.id) { + return { colOptions }; + } } } - } - }) - )?.colOptions as LinkToAnotherRecordType - ).fk_index_name; - } else { - foreignKeyName = relationColOpt.fk_index_name; - } + }) + )?.colOptions as LinkToAnotherRecordType + ).fk_index_name; + } else { + foreignKeyName = relationColOpt.fk_index_name; + } - if (!relationColOpt?.virtual && !virtual) { - // todo: handle relation delete exception - try { - await sqlMgr.sqlOpPlus(source, 'relationDelete', { - childColumn: childColumn.column_name, - childTable: childTable.table_name, - parentTable: parentTable.table_name, - parentColumn: parentColumn.column_name, - foreignKeyName, - }); - } catch (e) { - console.log(e.message); + if (!relationColOpt?.virtual && !virtual) { + // todo: handle relation delete exception + try { + await sqlMgr.sqlOpPlus(source, 'relationDelete', { + childColumn: childColumn.column_name, + childTable: childTable.table_name, + parentTable: parentTable.table_name, + parentColumn: parentColumn.column_name, + foreignKeyName, + }); + } catch (e) { + console.log(e.message); + } } }