带条件的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章
使用 GraphQL、Nexus 和 Prisma 优化 SQL 查询