簡體   English   中英

如何使用 Prisma ORM 在 MySQL 數據庫中保存一組圖像網址?

[英]How can I save an array of image Urls in MySQL database using Prisma ORM?

我正在使用 Next.js、pl.netscale(MySQL 數據庫)和 Prisma ORM 開發電子商務應用程序。

我有一個可以上傳圖片的表格。 我將這些圖像保存在 Firebase 存儲中。 作為回報,我收到一組圖像網址。 例如,我從 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']

現在,我想將這些圖像保存在我的數據庫中。 我正在為我的數據庫使用 pl.netscale,並使用 Prisma 與我的數據庫進行交互。

這是我的問題:

(1) Product model里面的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 model 會有其他字段,但首先,我想先解決這個問題。

您可以創建一個新的 model 來管理產品和 url 之間的一對多關系

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.`,
    });
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM