带条件的 Prisma 查询
Prisma Queries with conditions
我目前正在使用 Prisma 构建一个新项目,我正在考虑当我有不同的依赖项时如何构建我的 SQL 查询。
假设我想在某个条件下为查询添加一个include或一个where条件。
我现在应该为此使用新方法吗?喜欢秒API获取路径/api/users/with-include
分别/api/users/condition1
或者我应该按照此处的建议使用 if 查询扩展现有方法吗?
并分别使用一个查询参数/api/users?with-include=true
/api/users?condition1=true
这里的最佳做法是什么?
既然你可以有很多条件,这是否意味着你会为不同的条件创建很多端点?一开始,您可能很想这样做,但那会变得不灵活。
对于给定的端点,您可以在 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 构建一个新项目,我正在考虑当我有不同的依赖项时如何构建我的 SQL 查询。
假设我想在某个条件下为查询添加一个include或一个where条件。
我现在应该为此使用新方法吗?喜欢秒API获取路径/api/users/with-include
分别/api/users/condition1
或者我应该按照此处的建议使用 if 查询扩展现有方法吗?
并分别使用一个查询参数/api/users?with-include=true
/api/users?condition1=true
这里的最佳做法是什么?
既然你可以有很多条件,这是否意味着你会为不同的条件创建很多端点?一开始,您可能很想这样做,但那会变得不灵活。
对于给定的端点,您可以在 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 或根据您的需要自定义根据您的需要。