Implicite Many-to-Many relationship double primary key
Implicite Many-to-Many relationship with two models, but one of these two models has a double primary key?
Solution:Jump to solution
Here is an example of how you can define an explicit many-to-many relation based off of your example
```
model Kit {
kitid Int @id @default(autoincrement())
kitname String...
4 Replies
model Kit {
kitid Int @id @default(autoincrement())
kitname String
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
channelid BigInt?
enable Boolean @default(false)
kitrows KitRow[]
adminroles Role[] @relation(name: "adminrole")
requiredroles Role[] @relation(name: "requiredrole")
@@unique([kitname, guildid])
}
model Role {
roleid BigInt
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
kitidadminrole Int?
kitadminrole Kit? @relation(name: "adminrole", fields: [kitidadminrole], references: [kitid])
kitidrequiredrole Int?
kitrequeriedrole Kit? @relation(name: "requiredrole",fields: [kitidrequiredrole], references: [kitid])
@@id([roleid, guildid])
}
model Kit {
kitid Int @id @default(autoincrement())
kitname String
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
channelid BigInt?
enable Boolean @default(false)
kitrows KitRow[]
adminroles Role[] @relation(name: "adminrole")
requiredroles Role[] @relation(name: "requiredrole")
@@unique([kitname, guildid])
}
model Role {
roleid BigInt
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
kitidadminrole Int?
kitadminrole Kit? @relation(name: "adminrole", fields: [kitidadminrole], references: [kitid])
kitidrequiredrole Int?
kitrequeriedrole Kit? @relation(name: "requiredrole",fields: [kitidrequiredrole], references: [kitid])
@@id([roleid, guildid])
}
Hi @Sky✧ 👋
You can't use a multi-field
id when working with implicit many-to-many relations. See this section of the documentation.
You will need to use an explicit many-to-many relation. This involves creating a separate model to act as the relation table.
See the documentation on how to define an explicit many-to-many relation.Many-to-many relations | Prisma Documentation
How to define and work with many-to-many relations in Prisma.
Solution
Here is an example of how you can define an explicit many-to-many relation based off of your example
In this schema,
model Kit {
kitid Int @id @default(autoincrement())
kitname String
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
channelid BigInt?
enable Boolean @default(false)
kitrows KitRow[]
adminroles KitRole[] @relation(name: "adminrole")
requiredroles KitRole[] @relation(name: "requiredrole")
@@unique([kitname, guildid])
}
model Role {
roleid BigInt
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
kitroles KitRole[]
@@id([roleid, guildid])
}
model KitRole {
kitid Int
roleid BigInt
guildid BigInt
kit Kit @relation(fields: [kitid], references: [kitid])
role Role @relation(fields: [roleid, guildid], references: [roleid, guildid])
@@id([kitid, roleid, guildid])
}
model Kit {
kitid Int @id @default(autoincrement())
kitname String
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
channelid BigInt?
enable Boolean @default(false)
kitrows KitRow[]
adminroles KitRole[] @relation(name: "adminrole")
requiredroles KitRole[] @relation(name: "requiredrole")
@@unique([kitname, guildid])
}
model Role {
roleid BigInt
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
kitroles KitRole[]
@@id([roleid, guildid])
}
model KitRole {
kitid Int
roleid BigInt
guildid BigInt
kit Kit @relation(fields: [kitid], references: [kitid])
role Role @relation(fields: [roleid, guildid], references: [roleid, guildid])
@@id([kitid, roleid, guildid])
}
KitRole acts as the relation table between Kit and Role. The @@id([kitid, roleid, guildid]) in KitRole ensures that the combination of kitid, roleid, and guildid is unique. This allows you to store additional fields on the relation if needed and properly handles the composite primary key in the Role model.Hawo, I tried again today but when copying your code I get errors because of my double relations in Kit.
Errors :
Where ?
I think I need 2 join tables
New file with no errors
Error validating field `adminroles` in model `Kit`: The relation field `adminroles` on model `Kit` is missing an opposite relation field on the model `KitRole`. Either run `prisma format` or add it manually.Prisma
Error validating field `adminroles` in model `Kit`: The relation field `adminroles` on model `Kit` is missing an opposite relation field on the model `KitRole`. Either run `prisma format` or add it manually.Prisma
Error validating field `requiredroles` in model `Kit`: The relation field `requiredroles` on model `Kit` is missing an opposite relation field on the model `KitRole`. Either run `prisma format` or add it manually.Prisma
Error validating field `requiredroles` in model `Kit`: The relation field `requiredroles` on model `Kit` is missing an opposite relation field on the model `KitRole`. Either run `prisma format` or add it manually.Prisma
Error validating field `kit` in model `KitRole`: The relation field `kit` on model `KitRole` is missing an opposite relation field on the model `Kit`. Either run `prisma format` or add it manually.Prisma
Error validating field `kit` in model `KitRole`: The relation field `kit` on model `KitRole` is missing an opposite relation field on the model `Kit`. Either run `prisma format` or add it manually.Prisma
model Kit {
kitid Int @id @default(autoincrement())
kitname String
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
channelid BigInt?
enable Boolean @default(false)
kitrows KitRow[]
adminroles KitRole[] @relation(name: "adminrole") < HERE
requiredroles KitRole[] @relation(name: "requiredrole") < HERE
@@unique([kitname, guildid])
}
model Role {
roleid BigInt
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
kitroles KitRole[]
@@id([roleid, guildid])
}
model KitRole {
kitid Int
roleid BigInt
guildid BigInt
kit Kit @relation(fields: [kitid], references: [kitid]) < HERE
role Role @relation(fields: [roleid, guildid], references: [roleid, guildid])
@@id([kitid, roleid, guildid])
}
model Kit {
kitid Int @id @default(autoincrement())
kitname String
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
channelid BigInt?
enable Boolean @default(false)
kitrows KitRow[]
adminroles KitRole[] @relation(name: "adminrole") < HERE
requiredroles KitRole[] @relation(name: "requiredrole") < HERE
@@unique([kitname, guildid])
}
model Role {
roleid BigInt
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
kitroles KitRole[]
@@id([roleid, guildid])
}
model KitRole {
kitid Int
roleid BigInt
guildid BigInt
kit Kit @relation(fields: [kitid], references: [kitid]) < HERE
role Role @relation(fields: [roleid, guildid], references: [roleid, guildid])
@@id([kitid, roleid, guildid])
}
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:dev.db"
}
model Guild {
guildid BigInt @id
joinedAt DateTime @default(now())
prenium Boolean @default(false)
kits Kit[]
roles Role[]
}
model Kit {
kitid Int @id @default(autoincrement())
kitname String
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
channelid BigInt?
enable Boolean @default(false)
kitrows KitRow[]
adminroles KitAdminRole[]
requiredroles KitRequiredRole[]
@@unique([kitname, guildid])
}
model Role {
roleid BigInt
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
kitadminroles KitAdminRole[]
kitrequiredroles KitRequiredRole[]
@@id([roleid, guildid])
}
model KitAdminRole {
kitid Int
roleid BigInt
guildid BigInt
kit Kit @relation(fields: [kitid], references: [kitid])
role Role @relation(fields: [roleid, guildid], references: [roleid, guildid])
@@id([kitid, roleid, guildid])
}
model KitRequiredRole {
kitid Int
roleid BigInt
guildid BigInt
kit Kit @relation(fields: [kitid], references: [kitid])
role Role @relation(fields: [roleid, guildid], references: [roleid, guildid])
@@id([kitid, roleid, guildid])
}
model KitRow {
kitrowid Int @id @default(autoincrement())
kitrowname String
kitrowactions KitActionRow[]
kitid Int
kit Kit @relation(fields: [kitid], references: [kitid])
kitrowemoji String
@@unique([kitrowname, kitid])
}
model KitActionRow {
kitrowactionid Int @id @default(autoincrement())
actiontypeid Int
actiontype ActionType @relation(fields: [actiontypeid],references: [actiontypeid])
kitrowid Int
kitrow KitRow @relation(fields: [kitrowid], references: [kitrowid])
roleid BigInt?
duration Int?
}
model ActionType {
actiontypeid Int @id
actiontypelibelle String
kitrowactions KitActionRow[]
}
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:dev.db"
}
model Guild {
guildid BigInt @id
joinedAt DateTime @default(now())
prenium Boolean @default(false)
kits Kit[]
roles Role[]
}
model Kit {
kitid Int @id @default(autoincrement())
kitname String
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
channelid BigInt?
enable Boolean @default(false)
kitrows KitRow[]
adminroles KitAdminRole[]
requiredroles KitRequiredRole[]
@@unique([kitname, guildid])
}
model Role {
roleid BigInt
guildid BigInt
guild Guild @relation(fields: [guildid], references: [guildid])
kitadminroles KitAdminRole[]
kitrequiredroles KitRequiredRole[]
@@id([roleid, guildid])
}
model KitAdminRole {
kitid Int
roleid BigInt
guildid BigInt
kit Kit @relation(fields: [kitid], references: [kitid])
role Role @relation(fields: [roleid, guildid], references: [roleid, guildid])
@@id([kitid, roleid, guildid])
}
model KitRequiredRole {
kitid Int
roleid BigInt
guildid BigInt
kit Kit @relation(fields: [kitid], references: [kitid])
role Role @relation(fields: [roleid, guildid], references: [roleid, guildid])
@@id([kitid, roleid, guildid])
}
model KitRow {
kitrowid Int @id @default(autoincrement())
kitrowname String
kitrowactions KitActionRow[]
kitid Int
kit Kit @relation(fields: [kitid], references: [kitid])
kitrowemoji String
@@unique([kitrowname, kitid])
}
model KitActionRow {
kitrowactionid Int @id @default(autoincrement())
actiontypeid Int
actiontype ActionType @relation(fields: [actiontypeid],references: [actiontypeid])
kitrowid Int
kitrow KitRow @relation(fields: [kitrowid], references: [kitrowid])
roleid BigInt?
duration Int?
}
model ActionType {
actiontypeid Int @id
actiontypelibelle String
kitrowactions KitActionRow[]
}