【问题标题】:Replacing queries in a loop in prisma在 prisma 中循环替换查询
【发布时间】:2021-10-21 08:28:26
【问题描述】:

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

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

{
 '6151': 12
},

其中key是part_num,value是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);
  }

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

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

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

【问题讨论】:

    标签: javascript mysql prisma


    【解决方案1】:

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

    这里有一些 cmets 的代码来解释它的作用

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

    【讨论】:

    • 现在看起来很明显......这正是我想要的,谢谢!
    • 欢迎,乐于助人:D
    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2014-09-30
    • 2019-10-23
    • 2013-03-11
    相关资源
    最近更新 更多