Prisma【详解】 where 查询

精确筛选

查找名为 “John” 的用户

prisma.user.findMany({
    where: {
      name: 'John'
    }
});

模糊筛选 contains

查找邮箱地址包含 “example.com” 的用户

where: {
    email: {
      contains: 'example.com'
    }
  }

忽略大小写 insensitive

where: {
            name: {
                contains: 'john',
                mode: 'insensitive'
            }
        }

范围筛选

指定数组 in

查找 id 为 1、2 或 3 的用户

where: {
            id: {
                in: [1, 2, 3]
            }
        }

比较 gt 等

gt(大于)、gte(大于等于)、lt(小于)、lte(小于等于)

  • 查找年龄大于 18 岁的用户
    where: {
        age: {
          gt: 18
        }
      }
    

数组匹配查询 has

tags 字段是字符串数组类型

where: {
            tags: {
                has: 'discount' // 查找包含 'discount' 标签的产品
            }
        }

多条件筛选

查找年龄大于 18 岁且名字为 “John” 的用户

where: {
    age: {
      gt: 18
    },
    name: 'John'
  }

或 OR

查找名字为 “John” 或者年龄大于 18 岁的用户

where: {
    OR: [
      { name: 'John' },
      { age: { gt: 18 } }
    ]
  }

非 NOT

查找名字不是 “John” 的用户

where: {
    NOT: {
      name: 'John'
    }
  }

关联模型查询 some

查找发表过标题包含 “Prisma” 的文章的用户

where: {
    posts: {
      some: {
        title: {
          contains: 'Prisma'
        }
      }
    }
  }
  • some 表示至少有一个关联的 Post 记录满足条件,你还可以使用 every(所有关联记录都满足条件)和 none(没有关联记录满足条件)等操作符。

实战范例

日期范围查询

const start = new Date('2024-01-01');
    const end = new Date('2024-12-31');

    const events = await prisma.event.findMany({
        where: {
            startDate: {
                gte: start,
                lte: end
            }
        }
    });
### 使用 Prisma 进行带 `where` 条件的聚合查询 为了实现带有 `where` 条件的聚合查询,在 Prisma 中可以通过组合 `$aggregate` 和 `where` 参数来完成。这允许开发者不仅能够获取聚合统计信息,还能基于特定条件过滤数据。 #### 基本语法结构 当执行聚合操作并希望应用筛选条件时,可以在调用 `.aggregate()` 方法的同时传递一个包含 `where` 属性的对象作为参数。下面是一个简单的例子: ```typescript const result = await prisma.user.aggregate({ where: { age: { gt: 18, }, }, _count: true, // 计算符合条件记录的数量 }); console.log(result._count); ``` 此代码片段展示了如何计算年龄大于18岁的用户的数量[^2]。 对于更复杂的查询需求,比如多字段联合判断或嵌套逻辑表达式的场景,则可以构建更为精细的 `where` 对象。例如: ```typescript const complexResult = await prisma.post.aggregate({ where: { AND: [ { title: { contains: 'Prisma' } }, { OR: [{ authorId: 1 }, { categoryId: 2 }] } ] }, _sum: { viewCount: true, }, }); console.log(complexResult._sum.viewCount); // 输出满足条件的文章总浏览量 ``` 上述实例说明了通过设置多个布尔运算符(AND/OR/NOT),以及利用路径导航方式指定关联表中的属性来进行高级别的数据检索和汇总分析[^1]。 另外值得注意的是,如果涉及到跨模型的关系查询,确保已经在 Prisma Schema 文件里正确定义好了实体间的关系,这样才能让自动生成的客户端类型正确反映这些关系。 最后提醒一点,虽然这里只列举了一些基础类型的聚合函数(如 `_count`, `_sum`),实际上还有其他多种可用选项供选择,具体取决于所使用的数据库适配器支持哪些功能特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朝阳39

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值