You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prisma+MySQL中发送带空格的枚举值?

解决方案:无需下划线即可将Status存入数据库

当然可以实现。你的Prisma Schema已经通过@map指令把枚举键映射成了数据库中带空格的文本,现在只需要调整前端和后端的逻辑,让前端可以直接提交带空格的状态文本,后端自动转换为Prisma需要的枚举键即可。

步骤1:修改前端,使用带空格的状态选项

把当前的status输入逻辑改成下拉选择器,避免用户手动输入错误,同时直接展示带空格的状态文本:

import React, {useState} from 'react';
import Router from 'next/router';

const AddRequest = () => {
    const [name, setName] = useState('');
    const [projectID, setProjectID] = useState('');
    const [accountName, setAccountName] = useState('');
    // 初始值改为带空格的状态文本
    const [status, setStatus] = useState('To be Started');
    const [requestType, setRequestType] = useState('');
    const [totalHours, setTotalHours] = useState(0);

    // 定义所有可选状态
    const statusOptions = [
        'To be Started',
        'Work in Progress',
        'Awaiting Customer Confirmation',
        'Completed'
    ];

    const submitData = async (e: React.SyntheticEvent) => {
        e.preventDefault();
        try {
            const data = {
                name,
                projectID,
                accountName,
                status,
                requestType,
                totalHours,
            };
            await fetch('/api/requests/add', {
                method: 'POST',
                headers: {'Content-Type': 'application/json'},
                body: JSON.stringify(data),
            });
            await Router.push('/requests');
        } catch (error) {
            console.log(error);
        }
    };
    return (
        <>
            <div className="container flex-auto">
                <form onSubmit={submitData}>
                    <h1 className="text-3xl">New Request</h1>
                    <div className="text-center grid grid-cols-2 gap-3">
                        <input
                            className="border border-black"
                            type="text"
                            placeholder="Name"
                            value={name}
                            onChange={(e) => setName(e.target.value)}
                        />
                        <input
                            className="border border-black"
                            type="text"
                            placeholder="Project ID"
                            onChange={(e) => setProjectID(e.target.value)}
                            value={projectID}
                        />
                        <input
                            className="border border-black"
                            type="text"
                            placeholder="Account Name"
                            onChange={(e) => setAccountName(e.target.value)}
                            value={accountName}
                        />
                        <input
                            className="border border-black"
                            type="text"
                            placeholder="Request Type"
                            onChange={(e) => setRequestType(e.target.value)}
                            value={requestType}
                        />
                        {/* 替换为下拉选择器 */}
                        <select
                            className="border border-black"
                            value={status}
                            onChange={(e) => setStatus(e.target.value)}
                        >
                            {statusOptions.map(option => (
                                <option key={option} value={option}>{option}</option>
                            ))}
                        </select>
                        <button
                            className="border border-black bg-red-100"
                            disabled={!name || !projectID}
                            type="submit">
                            Create
                        </button>
                    </div>
                </form>
            </div>
        </>
    );
};
export default AddRequest;

步骤2:后端API添加状态映射逻辑

在创建数据库条目的API中,添加映射对象,把前端传来的带空格状态文本转换为Prisma枚举对应的键:

import type {NextApiRequest, NextApiResponse} from 'next';
import prisma from '../../../../lib/prisma';
import { requests_status } from '@prisma/client';

export default async function handle(
    req: NextApiRequest,
    res: NextApiResponse
) {
    const {name, projectID, accountName, status, requestType, totalHours} =
        req.body;

    // 建立状态文本到Prisma枚举键的映射
    const statusMap: Record<string, requests_status> = {
        "To be Started": "To_be_Started",
        "Work in Progress": "Work_in_Progress",
        "Awaiting Customer Confirmation": "Awaiting_Customer_Confirmation",
        "Completed": "Completed"
    };

    // 转换状态,提供默认值避免错误
    const mappedStatus = statusMap[status] || requests_status.Completed;

    const result = await prisma.requests.create({
        data: {
            name: name,
            project_id: projectID,
            account_name: accountName,
            status: mappedStatus,
            request_type: requestType,
            total_hours_spent: totalHours,
        },
    });
    res.json(result);
}

原理说明

  • Prisma的@map指令已经确保数据库中最终存储的是带空格的文本(比如To be Started),而非枚举键的下划线形式。
  • 前端通过下拉选择器直接使用带空格的状态文本,无需处理下划线转换。
  • 后端的映射逻辑负责把前端的文本转换为Prisma客户端能识别的枚举键,保证数据能正确存入数据库。

内容的提问来源于stack exchange,提问作者Hunter Bertoson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:06:21