From 5d9384f53052c96403d8c07ae9d05edf3676c4ef Mon Sep 17 00:00:00 2001 From: James Date: Mon, 9 Oct 2023 13:46:41 -0400 Subject: [PATCH] fix: #3513, hasMany relationships unable to be cleared --- .../src/transform/read/traverseFields.ts | 14 ++++++++- .../src/transform/write/traverseFields.ts | 2 +- test/relationships/int.spec.ts | 30 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/packages/db-postgres/src/transform/read/traverseFields.ts b/packages/db-postgres/src/transform/read/traverseFields.ts index 8382c1a65a..7718698b93 100644 --- a/packages/db-postgres/src/transform/read/traverseFields.ts +++ b/packages/db-postgres/src/transform/read/traverseFields.ts @@ -215,7 +215,19 @@ export const traverseFields = >({ if (field.type === 'relationship' || field.type === 'upload') { const relationPathMatch = relationships[`${sanitizedPath}${field.name}`] - if (!relationPathMatch) return result + if (!relationPathMatch) { + if ('hasMany' in field && field.hasMany) { + if (field.localized && config.localization && config.localization.locales) { + result[field.name] = { + [config.localization.defaultLocale]: [], + } + } else { + result[field.name] = [] + } + } + + return result + } if (field.localized) { result[field.name] = {} diff --git a/packages/db-postgres/src/transform/write/traverseFields.ts b/packages/db-postgres/src/transform/write/traverseFields.ts index 9ea92a0331..491fe7af23 100644 --- a/packages/db-postgres/src/transform/write/traverseFields.ts +++ b/packages/db-postgres/src/transform/write/traverseFields.ts @@ -335,7 +335,7 @@ export const traverseFields = ({ }) } } else { - if (fieldData === null) { + if (fieldData === null || (Array.isArray(fieldData) && fieldData.length === 0)) { relationshipsToDelete.push({ path: relationshipPath }) return } diff --git a/test/relationships/int.spec.ts b/test/relationships/int.spec.ts index c47bf3e2b1..e5f14e995e 100644 --- a/test/relationships/int.spec.ts +++ b/test/relationships/int.spec.ts @@ -434,6 +434,36 @@ describe('Relationships', () => { expect(director.docs[0].movies.length).toBeGreaterThan(10) }) + + it('should allow clearing hasMany relationships', async () => { + const fiveMovies = await payload.find({ + collection: 'movies', + limit: 5, + depth: 0, + }) + + const movieIDs = fiveMovies.docs.map((doc) => doc.id) + + const stanley = await payload.create({ + collection: 'directors', + data: { + name: 'Stanley Kubrick', + movies: movieIDs, + }, + }) + + expect(stanley.movies).toHaveLength(5) + + const stanleyNeverMadeMovies = await payload.update({ + collection: 'directors', + id: stanley.id, + data: { + movies: null, + }, + }) + + expect(stanleyNeverMadeMovies.movies).toHaveLength(0) + }) }) }) })