From 0b77eea0a793e11087dc13001cecac466139e7bb Mon Sep 17 00:00:00 2001 From: Nick Schot Date: Wed, 5 Dec 2018 17:50:07 +0100 Subject: [PATCH 1/2] fix: don't update belongsTo relationships for new records NOTE: side-effect is that duplicate ID's might occur when DB does not have a UNIQUE constraint on the FK --- src/packages/database/relationship/utils/update-relationship.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/database/relationship/utils/update-relationship.js b/src/packages/database/relationship/utils/update-relationship.js index 396c0509..b11c694f 100644 --- a/src/packages/database/relationship/utils/update-relationship.js +++ b/src/packages/database/relationship/utils/update-relationship.js @@ -115,7 +115,7 @@ function updateBelongsTo({ Reflect.set(record, opts.foreignKey, foreignKeyValue); - if (inverseOpts && inverseOpts.type === 'hasOne') { + if (inverseOpts && inverseOpts.type === 'hasOne' && !record.isNew) { return [ record.constructor .table() From c39cdd75b363717dab884dab0d5cdc0b60241087 Mon Sep 17 00:00:00 2001 From: Nick Schot Date: Wed, 23 Jan 2019 12:04:24 +0100 Subject: [PATCH 2/2] - restructure model create method to make sure we have a valid PK before updating relationships - undo isNew check in updateRelationships --- src/packages/database/model/index.js | 32 ++++++++++--------- .../relationship/utils/update-relationship.js | 2 +- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/packages/database/model/index.js b/src/packages/database/model/index.js index 546951d9..6f4b5922 100644 --- a/src/packages/database/model/index.js +++ b/src/packages/database/model/index.js @@ -1166,20 +1166,6 @@ class Model { const run = async (trx: Object) => { const { hooks, logger, primaryKey } = this; const instance = Reflect.construct(this, [props, false]); - let statements = []; - - const associations = Object - .keys(props) - .filter(key => ( - Boolean(this.relationshipFor(key)) - )); - - if (associations.length) { - statements = associations.reduce((arr, key) => [ - ...arr, - ...updateRelationship(instance, key, trx) - ], []); - } await runHooks(instance, trx, hooks.beforeValidation); @@ -1191,12 +1177,28 @@ class Model { hooks.beforeSave ); - const runner = createRunner(logger, statements); + const runner = createRunner(logger, []); const [[primaryKeyValue]] = await runner(await create(instance, trx)); Reflect.set(instance, primaryKey, primaryKeyValue); Reflect.set(instance.rawColumnData, primaryKey, primaryKeyValue); + let statements = []; + const associations = Object + .keys(props) + .filter(key => ( + Boolean(this.relationshipFor(key)) + )); + + if (associations.length) { + statements = associations.reduce((arr, key) => [ + ...arr, + ...updateRelationship(instance, key, trx) + ], []); + } + + await Promise.all(statements); + Reflect.defineProperty(instance, 'initialized', { value: true, writable: false, diff --git a/src/packages/database/relationship/utils/update-relationship.js b/src/packages/database/relationship/utils/update-relationship.js index b11c694f..396c0509 100644 --- a/src/packages/database/relationship/utils/update-relationship.js +++ b/src/packages/database/relationship/utils/update-relationship.js @@ -115,7 +115,7 @@ function updateBelongsTo({ Reflect.set(record, opts.foreignKey, foreignKeyValue); - if (inverseOpts && inverseOpts.type === 'hasOne' && !record.isNew) { + if (inverseOpts && inverseOpts.type === 'hasOne') { return [ record.constructor .table()