diff --git a/packages/schema/src/language-server/validator/datamodel-validator.ts b/packages/schema/src/language-server/validator/datamodel-validator.ts index 0d8b5eeff..1468311c8 100644 --- a/packages/schema/src/language-server/validator/datamodel-validator.ts +++ b/packages/schema/src/language-server/validator/datamodel-validator.ts @@ -256,15 +256,18 @@ export default class DataModelValidator implements AstValidator { relationOwner = field; } } else { - [field, oppositeField].forEach((f) => { - if (!this.isSelfRelation(f, thisRelation.name)) { - accept( - 'error', - 'Field for one side of relation must carry @relation attribute with both "fields" and "references" fields', - { node: f } - ); - } - }); + // if both the field is array, then it's an implicit many-to-many relation + if (!(field.type.array && oppositeField.type.array)) { + [field, oppositeField].forEach((f) => { + if (!this.isSelfRelation(f, thisRelation.name)) { + accept( + 'error', + 'Field for one side of relation must carry @relation attribute with both "fields" and "references" fields', + { node: f } + ); + } + }); + } return; } diff --git a/packages/schema/tests/schema/validation/datamodel-validation.test.ts b/packages/schema/tests/schema/validation/datamodel-validation.test.ts index 6e0c40b1d..76c38a3f1 100644 --- a/packages/schema/tests/schema/validation/datamodel-validation.test.ts +++ b/packages/schema/tests/schema/validation/datamodel-validation.test.ts @@ -257,6 +257,23 @@ describe('Data Model Validation Tests', () => { } `); + // many-to-many implicit + //https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#implicit-many-to-many-relations + await loadModel(` + ${prelude} + model Post { + id Int @id @default(autoincrement()) + title String + categories Category[] + } + + model Category { + id Int @id @default(autoincrement()) + name String + posts Post[] + } + `); + // one-to-one incomplete expect( await loadModelWithError(`