fix(db-mongodb): 4x and more level deep relationships querying (#12800)

Fixes https://github.com/payloadcms/payload/issues/12721
This commit is contained in:
Sasha
2025-06-13 17:11:13 +03:00
committed by GitHub
parent 7fef589ffa
commit 245a2dee7e
4 changed files with 41 additions and 5 deletions

View File

@@ -254,6 +254,11 @@ export default buildConfigWithDefaults({
relationTo: 'movies',
hasMany: true,
},
{
name: 'movie',
type: 'relationship',
relationTo: 'movies',
},
{
name: 'directors',
type: 'relationship',

View File

@@ -17,7 +17,6 @@ import type {
} from './payload-types.js'
import { initPayloadInt } from '../helpers/initPayloadInt.js'
import { isMongoose } from '../helpers/isMongoose.js'
import {
chainedRelSlug,
customIdNumberSlug,
@@ -430,6 +429,33 @@ describe('Relationships', () => {
expect(result.docs[0].id).toBe(id)
})
it('should allow 4x deep querying', async () => {
const movie_1 = await payload.create({
collection: 'movies',
data: { name: 'random_movie_1' },
})
const director_1 = await payload.create({
collection: 'directors',
data: { name: 'random_director_1', movie: movie_1.id },
})
const movie_2 = await payload.create({
collection: 'movies',
data: { name: 'random_movie_2', director: director_1.id },
})
const director_2 = await payload.create({
collection: 'directors',
data: { name: 'random_director_2', movie: movie_2.id },
})
const res = await payload.find({
collection: 'directors',
where: { 'movie.director.movie.name': { equals: 'random_movie_1' } },
})
expect(res.totalDocs).toBe(1)
expect(res.docs[0].id).toBe(director_2.id)
})
describe('hasMany relationships', () => {
it('should retrieve totalDocs correctly with hasMany,', async () => {
const movie1 = await payload.create({

View File

@@ -280,6 +280,7 @@ export interface Director {
name?: string | null;
localized?: string | null;
movies?: (string | Movie)[] | null;
movie?: (string | null) | Movie;
directors?: (string | Director)[] | null;
updatedAt: string;
createdAt: string;
@@ -742,6 +743,7 @@ export interface DirectorsSelect<T extends boolean = true> {
name?: T;
localized?: T;
movies?: T;
movie?: T;
directors?: T;
updatedAt?: T;
createdAt?: T;