diff --git a/packages/db-postgres/src/find/findMany.ts b/packages/db-postgres/src/find/findMany.ts index 6ca5a1165..dfe2f0bdf 100644 --- a/packages/db-postgres/src/find/findMany.ts +++ b/packages/db-postgres/src/find/findMany.ts @@ -33,7 +33,7 @@ export const findMany = async function find({ const db = adapter.sessions[req.transactionID]?.db || adapter.drizzle const table = adapter.tables[tableName] - let limit = limitArg ?? 10 + const limit = limitArg ?? 10 let totalDocs: number let totalPages: number let hasPrevPage: boolean @@ -51,6 +51,7 @@ export const findMany = async function find({ }) const orderedIDMap: Record = {} + let orderedIDs: (number | string)[] const selectDistinctMethods: ChainedMethods = [] @@ -116,7 +117,8 @@ export const findMany = async function find({ selectDistinctResult.forEach(({ id }, i) => { orderedIDMap[id as number | string] = i }) - findManyArgs.where = inArray(adapter.tables[tableName].id, Object.keys(orderedIDMap)) + orderedIDs = Object.keys(orderedIDMap) + findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs) } else { findManyArgs.limit = limitArg === 0 ? undefined : limitArg @@ -132,7 +134,7 @@ export const findMany = async function find({ const findPromise = db.query[tableName].findMany(findManyArgs) - if (pagination !== false || selectDistinctResult?.length > limit) { + if (pagination !== false && (orderedIDs ? orderedIDs?.length >= limit : true)) { const selectCountMethods: ChainedMethods = [] joinAliases.forEach(({ condition, table }) => { @@ -174,9 +176,8 @@ export const findMany = async function find({ rawDocs.sort((a, b) => orderedIDMap[a.id] - orderedIDMap[b.id]) } - if (pagination === false) { + if (pagination === false || !totalDocs) { totalDocs = rawDocs.length - limit = totalDocs totalPages = 1 pagingCounter = 1 hasPrevPage = false diff --git a/test/relationships/config.ts b/test/relationships/config.ts index 54c4d15f0..b85655cb1 100644 --- a/test/relationships/config.ts +++ b/test/relationships/config.ts @@ -199,6 +199,39 @@ export default buildConfigWithDefaults({ }, ], }, + { + fields: [ + { + name: 'movieReviewer', + relationTo: 'users', + required: true, + type: 'relationship', + }, + { + name: 'likes', + hasMany: true, + relationTo: 'users', + type: 'relationship', + }, + { + name: 'visibility', + options: [ + { + label: 'followers', + value: 'followers', + }, + { + label: 'public', + value: 'public', + }, + ], + required: true, + type: 'radio', + }, + ], + + slug: 'movieReviews', + }, ], onInit: async (payload) => { await payload.create({ diff --git a/test/relationships/int.spec.ts b/test/relationships/int.spec.ts index c62f6b677..8f695159a 100644 --- a/test/relationships/int.spec.ts +++ b/test/relationships/int.spec.ts @@ -185,6 +185,73 @@ describe('Relationships', () => { expect(status).toEqual(400) }) + it('should count totalDocs correctly when using or in where query and relation contains hasMany relationship fields', async () => { + const user = ( + await payload.find({ + collection: 'users', + }) + ).docs[0] + + const user2 = await payload.create({ + collection: 'users', + data: { + email: '1@test.com', + password: 'fwefe', + }, + }) + const user3 = await payload.create({ + collection: 'users', + data: { + email: '2@test.com', + password: 'fwsefe', + }, + }) + const user4 = await payload.create({ + collection: 'users', + data: { + email: '3@test.com', + password: 'fwddsefe', + }, + }) + await Promise.all([ + payload.create({ + collection: 'movieReviews', + data: { + likes: [user3.id, user2.id, user.id, user4.id], + movieReviewer: user.id, + visibility: 'public', + }, + }), + payload.create({ + collection: 'movieReviews', + data: { + movieReviewer: user2.id, + visibility: 'public', + }, + }), + ]) + + const query = await payload.find({ + collection: 'movieReviews', + depth: 1, + where: { + or: [ + { + visibility: { + equals: 'public', + }, + }, + { + movieReviewer: { + equals: user.id, + }, + }, + ], + }, + }) + expect(query.totalDocs).toEqual(2) + }) + describe('Custom ID', () => { it('should query a custom id relation', async () => { const { doc } = await client.findByID({ id: post.id })