From 27b1629927aed82cc1b587b7326b7ca21c0c8b25 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 30 Sep 2024 16:47:21 -0400 Subject: [PATCH] fix(db-postgres, db-sqlite): joins relation name (#8491) A join field on a relationship with a camelCase name would cause an error from drizzle due to the relation name not matching. --- packages/db-sqlite/src/schema/traverseFields.ts | 2 +- .../drizzle/src/postgres/schema/traverseFields.ts | 2 +- test/joins/.gitignore | 2 +- test/joins/collections/Categories.ts | 6 ++++++ test/joins/collections/Posts.ts | 5 +++++ test/joins/int.spec.ts | 12 ++++++++++++ test/joins/payload-types.ts | 5 +++++ 7 files changed, 31 insertions(+), 3 deletions(-) diff --git a/packages/db-sqlite/src/schema/traverseFields.ts b/packages/db-sqlite/src/schema/traverseFields.ts index 4548b0e7c6..2678350b05 100644 --- a/packages/db-sqlite/src/schema/traverseFields.ts +++ b/packages/db-sqlite/src/schema/traverseFields.ts @@ -907,7 +907,7 @@ export const traverseFields = ({ type: 'many', // joins are not localized on the parent table localized: false, - relationName: toSnakeCase(field.on), + relationName: field.on.replaceAll('.', '_'), target, }) break diff --git a/packages/drizzle/src/postgres/schema/traverseFields.ts b/packages/drizzle/src/postgres/schema/traverseFields.ts index 0150dda9b5..22a0276982 100644 --- a/packages/drizzle/src/postgres/schema/traverseFields.ts +++ b/packages/drizzle/src/postgres/schema/traverseFields.ts @@ -915,7 +915,7 @@ export const traverseFields = ({ type: 'many', // joins are not localized on the parent table localized: false, - relationName: toSnakeCase(field.on), + relationName: field.on.replaceAll('.', '_'), target, }) break diff --git a/test/joins/.gitignore b/test/joins/.gitignore index 9a9546b344..3f549faf91 100644 --- a/test/joins/.gitignore +++ b/test/joins/.gitignore @@ -1 +1 @@ -/uploads/ +uploads diff --git a/test/joins/collections/Categories.ts b/test/joins/collections/Categories.ts index 0697de46e8..cb353f943f 100644 --- a/test/joins/collections/Categories.ts +++ b/test/joins/collections/Categories.ts @@ -60,6 +60,12 @@ export const Categories: CollectionConfig = { collection: postsSlug, on: 'group.category', }, + { + name: 'camelCasePosts', + type: 'join', + collection: postsSlug, + on: 'group.camelCaseCategory', + }, ], }, ], diff --git a/test/joins/collections/Posts.ts b/test/joins/collections/Posts.ts index 77c6e35f82..a78ab3ea9c 100644 --- a/test/joins/collections/Posts.ts +++ b/test/joins/collections/Posts.ts @@ -32,6 +32,11 @@ export const Posts: CollectionConfig = { type: 'relationship', relationTo: categoriesSlug, }, + { + name: 'camelCaseCategory', + type: 'relationship', + relationTo: categoriesSlug, + }, ], }, ], diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 3d306ac4ed..e6da3572c8 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -68,6 +68,7 @@ describe('Joins Field', () => { upload: uploadedImage, group: { category: category.id, + camelCaseCategory: category.id, }, }) } @@ -107,6 +108,17 @@ describe('Joins Field', () => { expect(docs[0].category.relatedPosts.docs).toHaveLength(10) }) + it('should populate relationships in joins with camelCase names', async () => { + const { docs } = await payload.find({ + limit: 1, + collection: 'posts', + }) + + expect(docs[0].group.camelCaseCategory.id).toBeDefined() + expect(docs[0].group.camelCaseCategory.name).toBeDefined() + expect(docs[0].group.camelCaseCategory.group.camelCasePosts.docs).toHaveLength(10) + }) + it('should populate uploads in joins', async () => { const { docs } = await payload.find({ limit: 1, diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 2d46776e26..a9f83397cd 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -59,6 +59,7 @@ export interface Post { category?: (string | null) | Category; group?: { category?: (string | null) | Category; + camelCaseCategory?: (string | null) | Category; }; updatedAt: string; createdAt: string; @@ -101,6 +102,10 @@ export interface Category { docs?: (string | Post)[] | null; hasNextPage?: boolean | null; } | null; + camelCasePosts?: { + docs?: (string | Post)[] | null; + hasNextPage?: boolean | null; + } | null; }; updatedAt: string; createdAt: string;