prisma client는 null
과 undefined
를 다음과 같이 구분한다:
null
은 값이다.undefined
는 아무 것도 하지 않음을 의미한다.다음 예시에서 emailInput
이 null
일 경우에 쿼리셋은 email
을 undefined
로 설정한다. 👉🏻 업데이트에 emailInput
을 포함하지 않겠다는 의미이다.
const update = await prisma.user.update({
where: {
id: 1,
},
data: {
name: "Petunia",
email: emailInput != null ? emailInput : undefined, // If null, don't include in update!
},
});
field value를 undefined
로 설정하면 그냥 그 field를 비워두는 거랑 똑같다.
반면에, 다음과 같이
email
을 mandatory field로 설정하고 싶은, null
이 들어오면 안되는 경우에는 다음과 같이 해준다.
email: isValid(emailInput) ? emailInput : null, // email is a mandatory field!
만약 emailInput이 valid하지 않으면 null
이 들어가게 될 거고, typescript는 다음과 같은 오류를 뿜는다.
Type 'null' is not assignable to type 'string'. ts(2322)
null
과 undefined
가 조건에 미치는 영향프리자마가 nullable values를 다루는 방식으로 조건으로 필터링을 하는 경우에 우리는 예상했던 것과는 다른 결과를 얻을 수도 있다.
프리즈마의 operator들이 필터 개수에 따라 처리하는 방식을 정리한 표다.
Operator | 0 filters | 1 filter | n filters |
---|---|---|---|
OR | return empty list | validate single filter | validate all filters |
AND | return all items | validate single filter | validate all filters |
NOT | return all items | validate single filter | validate all filters |
interface FormData {
name: string;
email?: string;
}
const formData: FormData = {
name: 'Emelie'
}
const users = await prisma.user.findMany({
where: {
OR: [
{
email: {
contains: formData.email
}
}
]
}
})
// returns: []
위의 예시와 같이 OR
연산자 안에서 undefined
를 사용할 경우 empty list가 반환된다
반면에 AND
와 NOT
연산자 안에서 undefined
를 사용하면 모든 유저가 반환된다.
const users = await prisma.user.findMany({
where: {
AND: [
{
email: {
contains: formData.email
}
}
]
}
})
// returns: { id: 1, email: 'ems@boop.com', name: 'Emelie' }
const users = await prisma.user.findMany({
where: {
NOT: [
{
email: {
contains: formData.email
}
}
]
}
})
// returns: { id: 1, email: 'ems@boop.com', name: 'Emelie' }