如何使用Prisma ORM在MySQL数据库中保存图像URL数组?

l7wslrjt  于 2022-12-28  发布在  Mysql
关注(0)|答案(1)|浏览(148)

我正在使用Next.js,planetscale(MySQL数据库)和Prisma ORM开发一个电子商务应用程序。
我有一个可以上传图片的表单。我将这些图片保存在Firebase存储中。作为回报,我会收到一个图片URL数组。例如,我从Firebase存储中收到的数组如下所示:

['https://firebasestorage.googleapis.com/v0/b/ishop-…=media&token=2633c821-38f3-437b-b905-2995168e3b42', 'https://firebasestorage.googleapis.com/v0/b/ishop-…=media&token=163aaf93-accc-4d64-8e27-92609c14aaaa']

现在,我想把这些图像保存在我的数据库中。我正在为我的数据库使用planetscale,并使用prisma与我的数据库交互。
我的问题是:
(1)Product模型中urls字段的字段类型应该是什么?下面是我的schema.json文件:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider     = "mysql"
  url          = env("DATABASE_URL")
  relationMode = "prisma"
}

model Product {
  id          Int      @id @default(autoincrement())
  urls        
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
}

我知道它不能是标量列表(例如String[]),因为MySQL不支持标量列表。
我还想知道,在确定了urls字段的字段类型之后,是否应该注意如何使用Prisma在数据库中创建记录?
下面是我的product-upload API路径,在这里我使用Prisma客户机在数据库中创建一条记录。

import prisma from "../../lib/prisma";

export default async function handler(req, res) {
  if (req.method === "POST") {
    try {
      const { urls } = req.body;

      const product = await prisma.product.create({
        data: { urls },
      });
      res.status(200).json(product);
    } catch (error) {
      res.status(500).json({ message: error.message });
    }
  } else {
    res.setHeader("Allow", ["POST"]);
    res.status(405).json({
      message: `HTTP method ${req.method} is not allowed.`,
    });
  }
}

请注意,Product模型将有其他字段,但首先,我想先对这个问题进行排序。

pjngdqdw

pjngdqdw1#

您可以创建一个新模型来管理产品和URL之间的one-to-many relationship

model Product {
  id        Int          @id @default(autoincrement())
  urls      ProductUrl[]
  createdAt DateTime     @default(now())
  updatedAt DateTime     @updatedAt
}

model ProductUrl {
  url       String
  productId Int
  product   Product @relation(fields: [productId], references: [id], onDelete: Cascade)

  @@id([url, productId])
  @@index([productId])
}

然后,要添加URL,您需要将API路由更新为如下所示:

import prisma from "../../lib/prisma";

export default async function handler(req, res) {
  if (req.method === "POST") {
    try {
      // assuming urls is of type string[]
      const { urls } = req.body;

      const product = await prisma.product.create({
        data: {
          urls: {
            create: urls.map((url) => ({ url })),
          },
        },
        include: {
          urls: true,
        },
      });
      res.status(200).json(product);
    } catch (error) {
      res.status(500).json({ message: error.message });
    }
  } else {
    res.setHeader("Allow", ["POST"]);
    res.status(405).json({
      message: `HTTP method ${req.method} is not allowed.`,
    });
  }
}

相关问题