【问题标题】:Find many rows in Prisma ORM basing on random numbers根据随机数在 Prisma ORM 中查找多行
【发布时间】:2021-07-30 04:13:03
【问题描述】:

Prisma2 ORM

你好,有什么办法不能让它变短吗?看起来真的很糟糕..我试过循环,但它坏了。

生成卡片的随机索引

export const getRandomCards = (cards: any) => {
  let randomCards: number[] = [];
  while (randomCards.length < 5) {
    let card = Math.floor(Math.random() * cards.length);
    if (!randomCards.includes(card)) randomCards.push(card);
  }
  return randomCards;
};

然后我想根据数组中先前生成的索引发送卡片。

import express, { Request, Response, NextFunction } from "express";

import { getRandomCards } from "./../../../util";

import prisma from "../../../client";

export const getEvents = async (
  _req: Request,
  res: Response,
  next: NextFunction
) => {
  const cards = await prisma.event.findMany();

  if (!cards) throw new Error();

  const randomCards = getRandomCards(cards);

  try {
    const firstCard = await prisma.event.findUnique({
      where: {
        id: randomCards[0],
      },
    });
    const secondCard = await prisma.event.findUnique({
      where: {
        id: randomCards[1],
      },
    });
    const thirdCard = await prisma.event.findUnique({
      where: {
        id: randomCards[2],
      },
    });
    const fourthCard = await prisma.event.findUnique({
      where: {
        id: randomCards[3],
      },
    });
    const fifthCard = await prisma.event.findUnique({
      where: {
        id: randomCards[4],
      },
    });

    res.send({
      cards: { firstCard, secondCard, thirdCard, fourthCard, fifthCard },
    });
  } catch (err) {
    throw new Error(err);
  }

  next();
};

这样做是正确的做法吗?

【问题讨论】:

    标签: typescript express orm prisma


    【解决方案1】:

    我建议您在查询中使用 in 运算符。

    您当前方法的问题在于它“非常手动”。如果要查询20张随机卡怎么办?你不能写 20 个案例……(记住,开发者很懒)

    const cards = await prisma.event.findMany({
      where: {
        id: { in: randomCards },
      },
    })
    

    为什么需要这样做?

    const cards = await prisma.event.findMany();
    
    if (!cards) throw new Error();
    

    我认为你可以跳过它。 如果你有 200k 条记录会发生什么?您将查询整个表以...丢弃数据然后重新运行 5 次查询?

    只需运行我上面给你的查询,也许你可以做一个检查,比如“if cards.length === 0”然后抛出一个错误。

    另外,我建议您:

    • randomCards 重命名为randomCardIds,与getRandomCards 相同 -> getRandomCardIds(否则会假定该变量包含一个卡片对象,而它只包含 ID。
    • event 实体重命名为card 可能吗?读起来有点反直觉:const cards = await prisma.event.XXX。是event 还是cards

    参考:

    【讨论】:

    • 非常感谢伙计!我只是需要这样的提示,我绝对确定我做错了。
    猜你喜欢
    • 2021-11-04
    • 2021-04-23
    • 1970-01-01
    • 2022-10-16
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多