개발/PrismaORM

언젠가 사용하게 될 Prisma ORM 옵션 종류 및 설명 (3)

jaein 2023. 8. 2. 18:29

 

 

 

 

1. some - 배열 중 하나라도 일치하는 데이터를 찾을 때 (일대다 관계에서 사용)

const product = prisma.product.findFirst({
  where: {
    photos: {
      some: {
        { url: "2.jpg" },
      }
    }
  },
})

 

some을 사용하면 배열 중 한개의 데이터라도 일치하는 항목을 불러온다.

일대일 관계에서는 데이터가 배열일 수 없으니 some을 사용하지 않고

다대다 관계에서는 따로 테이블을 생성해 관리해 some을 사용하지 않으므로

일대다 관계에서 사용된다.

 

 

Product 테이블

id name
1 상품 A
2 상품 B
3 상품 C

 

Photos 테이블

id url product_id
1 1.jpg 1
2 2.jpg 1
3 3.jpg 2
4 2.jpg 3

 

db가 이런 구조로 되어있을때

 

 

product = {
  id: 1,
  name: '상품 A',
  photos: [
    { id: 1, url: '1.jpg', product_id: 1 },
    { id: 2, url: '2.jpg', product_id: 1 },
  ]
}

findFirst에서 some을 사용했을때의 반환값,

 

 

product = {
  id: 4,
  name: '상품 C',
  photos: [
    { id: 4, url: '2.jpg', product_id: 3 },
  ]
}

findFirst에서 some을 사용하지 않았을때의 반환값이다.

 

 

findFirst에서 some을 사용하면 조건의 맞는 데이터 중에 첫번째 값 중 일치하는 데이터를 모두 불러오고

findFirst에서 some을 사용하지 않으면 조건의 맞는 데이터 중 첫번째 값만 불러오기 때문에

이런 차이를 보인다.

 

그렇다면 findMany와는 어떻게 다를까?

 

product = [
  {
    id: 1,
    name: 'Product A',
    photos: [
      { id: 1, url: '1.jpg', product_id: 1 },
      { id: 2, url: '2.jpg', product_id: 1 },
    ]
  },
  {
    id: 3,
    name: 'Product C',
    photos: [
      { id: 4, url: '2.jpg', product_id: 3 },
    ]
  }
]

findMany로 조건을 입력했을때의 반환값이다.

 

상황에 따라 적절히 사용하자!