带条件的 Prisma 查询

Posted

技术标签:

【中文标题】带条件的 Prisma 查询【英文标题】:Prisma Queries with conditions 【发布时间】:2020-12-18 01:07:12 【问题描述】:

我目前正在使用 Prisma 构建一个新项目,并且正在考虑如何在我有不同的依赖项时构建我的 SQL 查询。

假设我想在特定条件下向查询添加包含或位置条件。 我现在应该为此使用新方法吗?像第二个 API 获取路径 /api/users/with-include/api/users/condition1

或者我应该按照这里的建议使用 if 查询扩展现有方法吗?

Prisma 2 query to return records only that are associated with ALL of the provided tag IDs

并分别使用查询参数/api/users?with-include=true/api/users?condition1=true

这里的最佳做法是什么?

【问题讨论】:

【参考方案1】:

既然你可以有很多条件,这是否意味着你会为不同的条件制作很多端点?起初,您可能很想这样做,但这变得不灵活。

对于给定的端点,您可以在 GET(如果使用 POST,则为正文)的查询参数中基于过滤器(例如 where、include、limit、order 等)查询数据。

休息

/api/users?filter[where][gender]=male&filter[take]=10

或字符串化的 JSON 格式:

/api/users?filter="where":"gender":"male","take":10

通过上面的示例,您可以进行灵活的查询,并且您可以直接将这个filter 查询对象用于您的 Prisma 查询,假设您已经以这种方式制作它(上面的示例是)。

但我建议不要直接使用它,因为任何人都可以操纵查询参数值。比如说,有人将take 的值从 10 更改为 200。你不会想要这样。因此,在这种情况下,您需要通过执行检查来设置限制:

const filter = getQueryObjectFromURL();

if( filter.where.take > 100 ) 
  filter.where.take = 100;

最后,您可以在 Prisma 中使用 filter,例如:

await prisma.users.findMany(filter);

但是如果条件较少并且您不想要此级别的过滤器,那么您可以根据条件进行自定义查询。

api/users?gender=male

const  gender  = getQueryObjectFromURL();

const filter = 
   where: 
;


if(gender)
  filter.where.gender = gender; // You might want to check for values before doing this because gender=skdjshdf can be passed


您可以传递任意数量的查询参数,但您只检查是否存在您的案例所需的参数。如果它存在并且有效,请将其添加到您的过滤器中,否则忽略它。

如果有很多条件 (condition2, condition3, ...),您知道它将用于什么,因此它可以相应地用于准备 AND 或 OR 或根据您的需要进行任何自定义。

【讨论】:

以上是关于带条件的 Prisma 查询的主要内容,如果未能解决你的问题,请参考以下文章

Prisma 客户端查询最新

使用 GraphQL、Nexus 和 Prisma 优化 SQL 查询

prisma - 运行 graphql 查询时获取环境变量未找到错误消息

将 GraphQL/Prisma 字段设为私有/无法查询

使用 Prisma 通过关联表查询多对多关系

使用 Prisma 的嵌套创建查询返回未定义