【问题标题】:Search api prisma mysql where ANY搜索 api prisma mysql where ANY
【发布时间】:2022-02-20 00:21:28
【问题描述】:

我正在尝试为我的项目实施搜索 API。但是,当我有许多需要包含在查询中的变量时,我不确定如何完成此任务。例如,如何使用这段代码搜索任何字符?

jobs = await prisma.jobOffer.findMany({
            where: {
                OR: [
                    {
                        title: {
                            search: searchTerm?.replace(' ', ' | ') || undefined
                        }
                    },
                    {
                        description: {
                            search: searchTerm?.replace(' ', ' | ') || undefined
                        }
                    }
                ]
            },
            include: {
                category: true,
                company: true
            }
        })

更新: 如docs 中所述,如果未定义,OR 不返回任何结果。另一方面,如果未定义,AND 返回所有结果,所以我采用了这种方法:

jobs = await prisma.jobOffer.findMany({
        where: {
            AND: [ 
                   {
                       OR: [
                            {
                                title: {
                                    search: searchTerm?.replace(' ', ' | ') || undefined
                                }
                            },
                            {
                                 description: {
                                          search: searchTerm?.replace(' ', ' | ') || undefined
                                 }
                            }
                        ]
                   }
                 ]
        },
        include: {
            category: true,
            company: true
        }
    })

【问题讨论】:

  • 搜索任意字符是什么意思?您想检查该字段是否包含某些内容?比如长度 > 0,还是什么?
  • 如果 searchTerm 为空,则检索所有报价。我不想在查询之前执行此 IF 语句,因为我有一堆类似的变量,我想将它们放入查询中(例如按employmentType、salaryRange 搜索)。目前,如果 searchTerm 为空,则查询不会检索任何内容
  • 然后只传递 undefined 而不是搜索?
  • 所以当我通过 undefined 时我没有得到任何结果。如果我在这里通过 undefined,我想要所有工作机会,而不是 ANY
  • 我刚刚尝试了类似的架构,它工作正常,如果你通过 undefined 那么你会得到所有未过滤的结果。所以也许你做错了什么

标签: next.js api-design prisma


【解决方案1】:

如果OR 运算符中的所有条件都未定义,那么您将不会得到任何结果(docs),这是正确的。我的印象是您总是在那里至少有一个条件,但现在我看到您正在使用一个搜索词来检查所有字段。在这种情况下,您只需检查 searchTerm 是否存在,然后使用 OR 运算符,如下所示:

jobs = await prisma.jobOffer.findMany({
      // Such condition is to make TS happy, considering `type searchTerm = string | undefined`
      where: !searchTerm ? undefined : {
        OR: [
          {
            title: {
              search: searchTerm.replace(' ', ' | '),
            },
          },
          {
            description: {
              search: searchTerm.replace(' ', ' | '),
            },
          },
        ],
      },
    });

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 2023-03-27
    • 2011-07-25
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多