Hi everybody, I've been banging my head against th...
# orm-help
p
Hi everybody, I've been banging my head against the wall for the last hour. I want to implement a simple like system. An user, can like an item which it stores as an entry in the like table. Option 1: create a new record for each like and delete it on unlike Option 2: create a new record for each like and set liked column to true and set it to false on unlike Because userId and itemId are foreign keys in my schema my queries are not working. It seems impossible to use foreignkeys in 'where' for example. But if I can't check if userId and itemId are already in a row I can't check if a like already exist for the user on a certain comment.
Copy code
model Likes {
  id          String  @id @default(cuid())
  userId      String
  itemId      String
  liked       Boolean
  createdAt   DateTime @default(now())
  updatedAt   DateTime @default(now())
  user        User    @relation(fields: [userId], references: [id], onDelete: Cascade)
  items       Items   @relation(fields: [itemId], references: [id], onDelete: Cascade)
}

model Items {
  id          String  @id @default(cuid())
  content     String
  userId      String
  done        Boolean @default(false)
  createdAt   DateTime @default(now())
  updatedAt   DateTime @default(now())
  completedAt DateTime?
  user        User    @relation(fields: [userId], references: [id], onDelete: Cascade)
  comments    Comments[]
  likes       Likes[]
  products    Products[]
}

model User {
  id            String    @id @default(cuid())
  name          String?   @unique @default(cuid())
  displayName   String?
  location      String?
  bio           String?
  twitter       String?
  email         String?   @unique
  emailVerified DateTime?
  image         String?
  lastOnline    DateTime?
  isAdmin       Boolean @default(false)
  isPremium     Boolean @default(false)
  createdAt     DateTime   @default(now())
  updatedAt     DateTime   @updatedAt
  accounts      Account[]
  sessions      Session[]
  items         Items[]
  comments      Comments[]
  likes         Likes[]
  products     Products[]
}
The error I get
Copy code
Invalid `prisma.likes.upsert()` invocation:
{
  where: {
    userId: 'cl3mvrzw00040qj9vsn914xn0'
    ~~~~~~
  },
  create: {
    userId: 'cl3mvrzw00040qj9vsn914xn0',
    itemId: 'cl472xhbd0200va9vtfanjkqv',
    liked: true
  },
  update: {
    liked: true
  }
}

Unknown arg `userId` in where.userId for type LikesWhereUniqueInput. Did you mean `id`? Available args:
type LikesWhereUniqueInput {
  id?: String
}
👀 1
a
Hey there 👋, I would try adding a unique index to your
Likes
model:
Copy code
model Likes {
  id        String   @id @default(cuid())
  userId    String
  itemId    String
  liked     Boolean
  createdAt DateTime @default(now())
  updatedAt DateTime @default(now())
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  items     Items    @relation(fields: [itemId], references: [id], onDelete: Cascade)

  @@unique([itemId, userId]) // this denotes the combination of any itemId and userId will be unique
}
After re-generating your Prisma Client, you can now query like this:
Copy code
await prisma.likes.upsert({
    where: {
      itemId_userId: {
        userId: 'cl3mvrzw00040qj9vsn914xn0',
        itemId: 'cl472xhbd0200va9vtfanjkqv'
      }
    },
    create: {
      userId: 'cl3mvrzw00040qj9vsn914xn0',
      itemId: 'cl472xhbd0200va9vtfanjkqv',
      liked: true
    },
    update: {
      liked: true
    }
  })
v
👋 hey @pyjama929! Did you have a chance to see Austin's comment? Let us know if you still have any issues!