在Next.js 13.4与Prisma中自动分配默认分类值
实现默认关联'all-films'分类的步骤
1. 修改API创建逻辑(推荐,更可靠)
直接在后端API层处理关联逻辑,确保所有新创建的电影都会绑定all-films分类,不受前端传参影响:
import { db } from "@/lib/db"; import { NextResponse } from "next/server"; export async function POST(req: Request){ try { const { id, name, imageUrl, filmUrl } = await req.json() // 先确保all-films分类存在,不存在则自动创建 await db.category.upsert({ where: { id: 'all-films' }, update: {}, create: { id: 'all-films', name: '所有电影', imageUrl: '替换为你的分类图片链接' } }) const film = await db.film.create({ data: { id, name, imageUrl, filmUrl, // 关联已存在的all-films分类 category: { connect: { id: 'all-films' } } } }) return NextResponse.json(film) } catch (error) { console.log("[FILMS_POST]", error); return new NextResponse("Internal Error", {status: 500}) } }
2. (可选)前端表单显式携带默认分类
如果需要前端表单也默认包含该分类(比如后续扩展多选分类功能),可以修改前端代码:
首先更新表单默认值(需确保formSchema已添加categoryIds字段,例如z.array(z.string()).default(['all-films'])):
const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { id:"", name: "", imageUrl: "", filmUrl: "", categoryIds: ['all-films'] } }) const onSubmit = async (values: z.infer<typeof formSchema>) => { try { await axios.post("/api/films", values) form.reset() router.refresh() onClose() } catch (error) { console.log(error); } }
对应修改API接收逻辑:
export async function POST(req: Request){ try { const { id, name, imageUrl, filmUrl, categoryIds = ['all-films'] } = await req.json() // 确保默认分类存在 await db.category.upsert({ where: { id: 'all-films' }, update: {}, create: { id: 'all-films', name: '所有电影', imageUrl: '替换为你的分类图片链接' } }) const film = await db.film.create({ data: { id, name, imageUrl, filmUrl, category: { connect: categoryIds.map(id => ({ id })) } } }) return NextResponse.json(film) } catch (error) { console.log("[FILMS_POST]", error); return new NextResponse("Internal Error", {status: 500}) } }
内容的提问来源于stack exchange,提问作者co-flow
相关产品推荐
相关产品推荐

