如何使用 Prisma.js 为帖子分配一些标签?
我已经有一些标签,我想为帖子分配一些标签? 我不想创建新标签。
schema.prisma:
model Post {
Id String @id @default(uuid())
AuthorId String
Author User @relation(fields: [AuthorId], references: [Id])
CategoryId String?
Category Category? @relation(fields: [CategoryId], references: [Id])
Title String @db.VarChar(255)
Description String? @db.MediumText
Summary String? @db.VarChar(255)
Tags TagPostMapping[]
}
model TagPostMapping {
Id String @id @default(uuid())
Post Post? @relation(fields: [PostId], references: [Id])
PostId String?
Tag Tag? @relation(fields: [TagId], references: [Id])
TagId String?
CreatedDate DateTime @default(now())
ModifiedDate DateTime? @updatedAt
}
model Tag {
Id String @id @default(uuid())
Title String @unique
Posts TagPostMapping[]
CreatedDate DateTime @default(now())
ModifiedDate DateTime? @updatedAt
}
在Prisma网站上有一个示例,但它适合创建一些标签并将它们分配给帖子。 虽然我想在文章中添加一些现有的标签。
我也遇到过类似的情况,下面的代码对我有用:
addTagToPost(addTagDto: AddTagDto): Promise<TagDto> {
return prisma.tag.update({
where: { Id: addTagDto.tagId },
data: {
Posts: {
create: [
{
Post: {
connect: {
Id: addTagDto.postId,
},
},
},
],
},
},
});
}
PS:由于
Post
和Tag
是多对多的关系,所以你也可以更新prisma.post.update
。
我通过使用 connectOrCreate 和 prisma v4 解决了这个问题。有了它,您可以连接/分配数据库中已存在的标签,而无需创建新标签。使用 connectOrCreate 的优点。如果数据库中不存在该标签,它可以创建一个新标签。该代码适用于您的 prisma 架构。
await prisma.post.create({
data: {
tags: {
create: [
{
tag:
{
connectOrCreate:
{
where: {
name: 'dev'
},
create: {
name: 'dev'
},
}
}
},
],
},
更新查询棱镜:
await prisma.post.update({
where: {
id: "idpost"
},
data: {
...
//same with code above
}
参考:
我也有同样的问题。但上面的这些解决方案对我不起作用。因为当我创建帖子时,我没有
postId
,也没有tagId
。还有其他解决办法吗?
我使用了
$transaction
,在这个事务中我创建了2个插入命令,我还使用uuid包定义了一个用于发布的ID。 postId = v4()
。 v4()
是 uuid
中的函数,可生成唯一的 Id
。
public async Create(post: IPost): Promise<Post> {
let postId = v4();
let postTagIds: postTagMapping[] = [];
post.Tags?.map(tag => postTagIds.push({ PostId: postId, TagId: tag.Id }));
const transResult = await ApplicationDbContext.Prisma.$transaction([
ApplicationDbContext.Prisma.post.create({
data: {
Id: postId,
Title: post.Title,
Summary: post.Summary,
Description: post.Description,
IsActive: post.IsActive,
IsPublished: post.IsPublished,
IsActiveNewComment: post.IsActiveNewComment,
AuthorId: post.AuthorId,
CategoryId: post.CategoryId,
},
}),
ApplicationDbContext.Prisma.tagPostMapping.createMany({
data: postTagIds
})
]).finally(async () => {
await ApplicationDbContext.Prisma.$disconnect();
});
let result = transResult as unknown as Post;
return result;
}