在 prisma 的循环中替换查询

Replacing queries in a loop in prisma

我有一个 API 端点需要获取 30 个项目的数据,它需要检查两个不同字段中的值以 return 正确。我正在使用 Prisma ORM。

在一个请求中,我得到一个对象数组,如下所示:

{
 '6151': 12
},

其中键是 part_num,值是 color_id。我将键和值分成数组,我正在循环中一个一个地寻找每个元素:

  const elements = [];
  for (let i = 0; i < partNums.length; i++) {
    const element = await prisma.elements.findFirst({
      where: { AND: { part_num: partNums[i], color_id: colors[i] } },
    });
    elements.push(element);
  }

它似乎工作正常,但我读到对数据库进行多次查询是一种不好的做法,所以我的问题是:

有没有办法在一次查询中获得相同的结果?

我唯一的想法是仅通过其中一个字段获取所有元素,而不是过滤掉我不需要的元素。然而,这首先需要从数据库中获取更多元素,并且过滤也需要一些时间。

您可以使用单个 findMany 查询。您需要在循环中生成 where 条件。它将是一组 OR 条件,每个条件指定一个 Element 记录。

这是带有一些注释的代码,用于解释它的作用

    let findManyOrCondition = [];  // each entry will contain a single part_nums, color_id condition pair.

    for (let i = 0; i < partNums.length; i++) {
        // AND condition between part_num and color_id is implicit
        findManyOrCondition.push({ 
            part_num: partNums[i], 
            color_id: colors[i],
        });
    }
    
    // fetch all of the elements with one query. 
    const elements = await prisma.elements.findMany({
        where: {
            OR: findManyOrCondition,
        },
    });