Can't connect a model to anothe model on Prisma

Issue

I’m developing a simple project for food ordering and I’m using Node.js, Express, and Prisma as ORM for dealing with SQlite.

This is my actual schema.prisma:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

model Users {
  id        String                     @id @default(uuid())
  email     String
  name      String
  password  String
  admin     Boolean                    @default(false)
  image     String?
  orders    Orders[]
  favorites UsersHasFavoriteProducts[]
  createdAt DateTime                   @default(now()) @map("created_at")
  updatedAt DateTime                   @updatedAt @map("updated_at")

  @@map("users")
}

model UsersHasFavoriteProducts {
  id        String    @id @default(uuid())
  user      Users?    @relation(fields: [userId], references: [id])
  userId    String?   @map("user_id")
  product   Products? @relation(fields: [productId], references: [id])
  productId String?   @map("product_id")
  createdAt DateTime  @default(now()) @map("created_at")
  updatedAt DateTime  @updatedAt @map("updated_at")

  @@map("users_has_favorite_products")
}

model Orders {
  id         String              @id @default(uuid())
  totalPrice Decimal?            @map("total_price")
  payMethod  String              @default("pix") @map("pay_method")
  status     String              @default("payment pending")
  products   OrdersHasProducts[]
  user       Users?              @relation(fields: [userId], references: [id])
  userId     String?             @map("user_id")
  createdAt  DateTime            @default(now()) @map("created_at")
  updatedAt  DateTime            @updatedAt @map("updated_at")

  @@map("orders")
}

model OrdersHasProducts {
  id        String    @id @default(uuid())
  order     Orders?   @relation(fields: [orderId], references: [id])
  orderId   String?   @map("order_id")
  product   Products? @relation(fields: [productId], references: [id])
  productId String?   @map("product_id")
  quantity  Int
  createdAt DateTime  @default(now()) @map("created_at")
  updatedAt DateTime  @updatedAt @map("updated_at")

  @@map("orders_has_products")
}

model Products {
  id          String                     @id @default(uuid())
  name        String
  description String
  price       Decimal
  category    String
  ingredients ProductsHasIngredients[]
  image       String?
  orders      OrdersHasProducts[]
  favorites   UsersHasFavoriteProducts[]
  createdAt   DateTime                   @default(now()) @map("created_at")
  updatedAt   DateTime                   @updatedAt @map("updated_at")

  @@map("products")
}

model ProductsHasIngredients {
  id           String       @id @default(uuid())
  product      Products?    @relation(fields: [productId], references: [id])
  productId    String?      @map("product_id")
  ingredient   Ingredients? @relation(fields: [ingredientId], references: [id])
  ingredientId String?      @map("ingredient_id")
  createdAt    DateTime     @default(now()) @map("created_at")
  updatedAt    DateTime     @updatedAt @map("updated_at")

  @@map("products_has_ingredients")
}

model Ingredients {
  id        String                   @id @default(uuid())
  name      String
  price     Decimal
  quantity  Int
  image     String?
  products  ProductsHasIngredients[]
  createdAt DateTime                 @default(now()) @map("created_at")
  updatedAt DateTime                 @updatedAt @map("updated_at")

  @@map("ingredients")
}

The Controller will receive this JSON:

{
    "name": "Tomato sandwich",
    "description": "Tomato sandwich",
    "price": "22.00",
    "category": "Main",
    "ingredients": "09ea6c56-a289-474a-ac2a-33ccd7512c6e"
}

And on my repository I have a function for add a product on my database:

async create(name, description, price, category, ingredients) {
    return await prisma.products.create({
      data: {
        name,
        description,
        price,
        category,
        ingredients: {
          connect: { id: ingredients },
        },
      },
    });
  }

But I’m not able to create the relationship with the ingredients table, this error occurs:

The required connected records were not found. Expected 1 records to be connected after connect operation on one-to-many relation 'ProductsToProductsHasIngredients', found 
0.

Solution

Basically the Ingredients table do not have the ingredient you wanted to to connect while creating the Product. You can do something like Create or Connect or only create instead of connect.

    ingredients: {
      connectOrCreate: {
        where: {
          id: ingredients,
        },
        create: {
          id: ingredients
          ...otherRequiredFields,
        },
      },
    },

Answered By – xImouto

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published