model Categories{
id Int #default(autoincrement()) #id
name String #db.VarChar(30)
products Products[]
}
model Products{
id Int #default(autoincrement()) #id
englishName String #db.VarChar(40) #map("english_name")
category Categories #relation(fields: [categoryId], references: [id])
categoryId String
imgUrl String #map("img_url")
}
Hi! I'm connecting model categories and model products as one to many relations. I want to set categoryId in model Products as a foreign key, but it's not working. Someone please help me! Thank you!
I have modified a little bit your schema:
model Categories{
id Int #default(autoincrement()) #id
name String
products Products[] #relation()
}
model Products{
id Int #default(autoincrement()) #id
englishName String
category Categories #relation(fields: [categoryId], references: [id])
categoryId Int
}
After I have run the migration and finally I have executed the following:
const { PrismaClient } = require('#prisma/client');
const prisma = new PrismaClient();
const saveData = async () => {
const category = await prisma.categories
.create({
data: {
name: 'Category 1',
}
});
console.log(category);
const product = await prisma.products
.create({
data: {
englishName: 'Product 1',
category: {
connect: {
id: category.id
},
}
}
});
console.log(product);
const products = await prisma.products
.findMany({
include: {
category: true
}
});
console.log(products);
};
saveData();
and here you go the result
Related
I am trying to implement a relation querie with Prisma ORM but this error does not allow.
My system consists in a bugtracker, where the user can report bugs. So I'm linking the User with the bugs. When I try to create a new data this error appears: "Unique constraint failed on the constraint: Bug_authorId_key"
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model User {
id Int #id #default(autoincrement())
name String
email String #unique
password String
role String #default("User")
bugs Bug[]
teamId Int?
team Team? #relation(fields: [teamId], references: [id])
}
model Team {
id Int #id #default(autoincrement())
name String
users User[]
admins Admin[]
}
model Admin {
id Int #id #default(autoincrement())
name String
email String #unique
password String
role String #default("Admin")
teamId Int?
team Team? #relation(fields: [teamId], references: [id])
}
model Bug {
id Int #id #default(autoincrement())
title String
description String
status String
authorId Int
author User #relation(fields: [authorId], references: [id])
}
const bug = await prisma.bug.create({
data: {
title: req.body.title,
status: req.body.status,
description: req.body.description,
author: {
connect: {id: req.body.authorId}
}
}
})
I have the shorten schema like that:
model PATIENT {
patient_id Int #id #default(autoincrement())
patient_name String
patient_identity_card BigInt #unique
password String
wallet_id Int?
birthday DateTime
address String
status_id Int
gender String #default("Nam")
phone String #default("0935438280")
current_treatment_place_id Int
avatar_url String?
treatment_place TREATMENT_PLACE #relation(fields: [current_treatment_place_id], references: [place_id])
status PATIENT_STATUS #relation(fields: [status_id], references: [status_id])
card CART?
patient_passive_contact PATIENT_CONTACT[] #relation("ActiveContact_referredToPatient")
patient_active_contact PATIENT_CONTACT[] #relation("PassiveContact_referredToPatient")
BE_MANAGED_HISTORY BE_MANAGED_HISTORY[]
}
model BE_MANAGED_HISTORY {
place_id Int
patient_id Int
time DateTime
status_id Int
status PATIENT_STATUS #relation(fields: [status_id], references: [status_id])
patient PATIENT #relation(fields: [patient_id], references: [patient_id])
place TREATMENT_PLACE #relation(fields: [place_id], references: [place_id])
change_type_id Int
change_type CHANGE_MANAGED_HISTORY_TYPE #relation(fields: [change_type_id], references: [type_id])
##id([place_id, patient_id, time])
}
I want to create a BE_MANAGED_HISTORY record and through it create a PATIENT record with needed information. The nested writes below:
const res = await prisma.BE_MANAGED_HISTORY.create({
data: {
place_id: treatmentPlaceId,
time: new Date(startDate),
status_id: patientStatus,
change_type_id: 1,
patient: {
create: {
patient_name: patientName,
gender,
birthday: new Date(birthday),
patient_identity_card: identity,
password: hashedPassword,
phone,
address,
status_id: patientStatus,
current_treatment_place_id: treatmentPlaceId,
avatar_url: avatarUrl,
}
}
},
})
But prisma throws an error:
Unknown arg patient in data.patient for type BE_MANAGED_HISTORYUncheckedCreateInput. Did you mean patient_id?
Argument patient_id for data.patient_id is missing.
So can I create an beManagedHistory and create an patient inside nested writes?
We have to create a PATIENT record first, and nested in it creating a BE_MANAGED_HISTORY record.
I added a company property to the User model in my prisma.schema file (The rest of the prisma.schema file is still similar to the one in the documentation: https://next-auth.js.org/adapters/prisma)
model User {
id String #id #default(cuid())
name String?
email String? #unique
emailVerified DateTime?
image String?
accounts Account[]
sessions Session[]
company Company?
}
model Company {
id Int #id #default(autoincrement())
companyName String #unique
gender String
firstName String
lastName String
street String
houseNumber Int
postcode Int
city String
country String
countryCode String
callNumber Int
emailAddress String
website String?
socials Json?
companyUser User #relation(fields: [companyUserId], references: [id])
companyUserId String #unique
}
The whole authentification process is working fine even after the change but when I try to select a User from the database it only returns a certain portion of the User namely the id, name, email, emailVerified and image property.
How can I change this behaviour?
const user = await prisma.user.findUnique({
where: {
id: ...
}
})
For sure I could only create the Company model without connecting it to the User model and maybe adding the User's id to it to have an implicit connection, but that's undermining the whole purpose...
you're looking for nested reads, if you want to include the whole company model you should use include with the name of the relation, note that this will return all the fields for that specific relation:
const user = await prisma.user.findUnique({
where: {
id: ...
},
include: {
company: true,
},
})
if you want to return specific relation fields with the whole user you should use select inside include:
const user = await prisma.user.findUnique({
where: {
id: ...
},
include: {
company: {
select : {
firstName: true,
},
},
},
})
My models:
model Show {
id Int #id #default(autoincrement())
tvmazeId Int
name String
type Type #relation(fields: [typeId], references: id)
typeId Int
language Language #relation(fields: [languageId], references: id)
languageId Int
genres GenresOnShows[]
status Status #relation(fields: [statusId], references: id)
statusId Int
runtime Int?
premiered DateTime?
ended DateTime?
network Network? #relation(fields: [networkId], references: id)
country Country? #relation(fields: [countryId], references: id)
countryId Int
networkId Int
webchannel Webchannel? #relation(fields: [webchannelId], references: id)
webchannelId Int
tvrageId String? #unique
thetvdbId String? #unique
imdbId String? #unique
imageMed String? #unique
imageOrig String? #unique
summary String
}
model Status {
id Int #id #default(autoincrement())
name String #unique
shows Show[]
}
model Type {
id Int #id #default(autoincrement())
name String #unique
shows Show[]
}
model Language {
id Int #id #default(autoincrement())
name String #unique
shows Show[]
}
model Country {
id Int #id #default(autoincrement())
name String #unique
code String #unique
timezone String
shows Show[]
}
model Network {
id Int #id #default(autoincrement())
name String #unique
shows Show[]
}
model Webchannel {
id Int #id #default(autoincrement())
name String #unique
shows Show[]
}
model Genre {
id Int #id #default(autoincrement())
name String #unique
shows GenresOnShows[]
}
model GenresOnShows {
show Show #relation(fields: [showId], references: [id])
showId Int
genre Genre #relation(fields: [genreId], references: [id])
genreId Int
##id([showId, genreId])
}
What i try is getting show information from an api and populate the database. The problem is, that i need to populate related tables (like network, country, etc.) in the same action.
Here is how i get for example the country:
const country = await prisma.country.upsert(
{
where: {
name: show["network"]["country"]["name"]
},
update: {},
create: {
name: show["network"]["country"]["name"],
code: show["network"]["country"]["code"],
timezone: show["network"]["country"]["timezone"],
}
}
)
and heres the statement i use to try to update the show:
const showInDb = await prisma.show.upsert(
{
where: {
tvmazeId: show["id"]
},
update: {
typeId: {connect: {type}},
languageId: {connect: {language}},
genreConnectOrCreate: genreConnectOrCreate,
statusId: {connect: {status}},
networkId: {connect: {network}},
countryId: {connect: {country}},
webchannelId: {connect: {webchannel}},
name: show["name"],
runtime: parseInt(show["runtime"]),
premiered: new Date(show["premiered"]),
ended: new Date(show["ended"]),
tvrageId: show["externals"]["tvrage"].toString(),
tvdbId: show["externals"]["thetvdb"],
imdbId: show["externals"]["imdb"],
tvmazeId: show["id"],
imageMed: show["image"]["medium"],
imageOrig: show["image"]["original"],
summary: show["summary"]
},
create: {
typeId: {connect: {type}},
languageId: {connect: {language}},
genreConnectOrCreate: genreConnectOrCreate,
statusId: {connect: {status}},
networkId: {connect: {network}},
countryId: {connect: {country}},
webchannelId: webchannel,
name: show["name"],
runtime: parseInt(show["runtime"]),
premiered: new Date(show["premiered"]),
ended: new Date(show["ended"]),
tvmazeId: show["id"],
tvrageId: show["externals"]["tvrage"].toString(),
tvdbId: show["externals"]["thetvdb"],
imdbId: show["externals"]["imdb"],
imageMed: show["image"]["medium"],
imageOrig: show["image"]["original"],
summary: show["summary"]
}
}
)
I tried with the ID (for example countryId aswell as country itself). The error i get when using countryId is:
Unknown arg countryId in update.countryId for type ShowUpdateInput. Did you mean country?
if i use country:
Unknown arg country in update.country.connect.country for type CountryWhereUniqueInput. Did you mean code?
I also tried to privde the country without the connect like so:
country: country,
what is the correct way to do that?
I am trying to query a database using the Prism Client and want to get back only the rows that has a foreign key in a joined table.
For example, get all users who have also created a post. I need a kind of "INNER JOIN".
I have tried something like:
return this.prisma.user.findMany({
where: {
Post: {
some: {
id: {
not: 0,
}
}
}
}
});
But the result is not the correct one.
I'm not sure how to use "none, some or every"
Suppose I have a schema like this:
model User {
id Int #default(autoincrement()) #id
name String
posts Post[]
createdAt DateTime #default(now())
updatedAt DateTime #updatedAt
}
model Post {
id Int #default(autoincrement()) #id
title String
user User? #relation(fields: [userId], references: [id])
userId Int?
createdAt DateTime #default(now())
updatedAt DateTime #updatedAt
}
I get the users without any posts via the following query:
const usersWithoutPosts = await prisma.user.findMany({
where: {
posts: {
none: {
id: undefined,
},
},
},
})
Could you try this way and check?