Обновление Prisma с отношением, в котором свойство

#sql #prisma

#sql #призма

Вопрос:

Учитывая эти схемы:

 model awayinfo { PlayerID Int @id IsAway Boolean playerinfo playerinfo @relation(fields: [PlayerID], references: [ID]) }   model playerinfo { name String @db.VarChar(15) ID Int @id @unique @default(autoincrement()) awayinfo awayinfo? }  

Как бы я создал обновление prisma SQL для таблицы awayinfo, если бы единственным идентификатором, который у меня есть, было имя игрока, а не идентификатор?

что я пытался:

Я пытаюсь передать что-то в часть «ГДЕ», как показано ниже:

 const result = await prisma.awayinfo.update({  where: {  PlayerID: {  name: name  }  },  data: {  IsAway: true,  }  });  

но это всегда приводит меня к ошибке:

 Invalid `prisma.awayinfo.update()` invocation:   Argument PlayerID: Got invalid value {  name: 'Dummy'  } on prisma.updateOneawayinfo. Provided Json, expected Int.  

Я совсем отчаялся и даже попробовал выбрать что-нибудь вроде этого

 const result = await prisma.awayinfo.update({  where: {  PlayerID: {  playerinfo: {  Where: {  name: name  },  select: {ID: true},  }}  }, .....  

но очевидно, что это не сработало бы так же хорошо. Интересно, чего мне здесь не хватает, и я не могу найти ни одного примера условия в предложении WHERE в документации prisma

Ответ №1:

Здесь есть две проблемы: первая-в вашей схеме Prisma/модели данных, а вторая-в вашем запросе.

Создание name уникальных

Во-первых, если вы хотите однозначно идентифицировать запись в playerinfo таблице только с name помощью свойства, это свойство должно быть unique . В противном случае ваша база данных (и Prisma) не сможет узнать, какую информационную запись игрока обновлять, если существует несколько записей с одним и тем же name свойством.

Соответствующим образом обновите свою схему:

 model playerinfo {  name String @unique @db.VarChar(15)  ID Int @id @unique @default(autoincrement())  awayinfo awayinfo? }  

Перезапись запроса на обновление

Поскольку where условие в вашем обновлении ссылается playerinfo на модель свойств, именно с этого следует начать запрос. Вот как это выглядит:

 const data = await prisma.playerinfo.update({  where: {  name: name  },   data: {  awayinfo: {  update: {  IsAway: true  }  }  } })  

Комментарии:

1. Этот ответ очень подробный и полностью решает проблему. Я сам разобрался в этой уникальной части, но еще раз спасибо, что указали на это!

2. Добро пожаловать! Рад помочь 😀