查找查询
示例使用以下模式
generator client {
provider = "cargo prisma"
output = "src/prisma.rs"
}
model Post {
id String @id @default(cuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
published Boolean
title String
content String?
desc String?
comments Comment[]
}
model Comment {
id String @id @default(cuid())
createdAt DateTime @default(now())
content String
post Post @relation(fields: [postID], references: [id])
postID String
}
查找多个
find_many
搜索与提供的过滤器匹配的模型的所有记录。
use prisma::post;
let posts: Vec<post::Data> = client
.post()
.find_many(vec![post::title::equals("Title".to_string())])
.exec()
.await
.unwrap()
如果未找到任何记录,find_many
将返回一个空向量而不是错误。
查找第一个
find_first
搜索与提供的过滤器匹配的模型的第一条记录。与 find_many
一样,它需要一个过滤器列表。
use prisma::post;
let posts: Option<post::Data> = client
.post()
.find_first(vec![post::title::id("123".to_string())])
.exec()
.await
.unwrap()
查找唯一
find_unique
搜索与提供的唯一过滤器匹配的模型的单个记录。唯一过滤器是唯一字段的 equals()
过滤器。
如果未找到匹配的记录,查询的结果将为 None
,而不是抛出错误。
use prisma::post;
let posts: Option<post::Data> = client
.post()
.find_unique(post::id::equals("123".to_string()))
.exec()
.await
.unwrap()
关联过滤
关联过滤的方式与标量过滤类似,只是需要一些额外的函数。
单一关联
对于单一关联,有 is
和 is_not
过滤器。
以下示例获取其帖子标题为“我的标题”的所有评论
use prisma::{comment, post};
let comments: Vec<comment:Data> = client
.comment()
.find_many(vec![
comment::post::is(vec![
post::title::equals("My Title".to_string())
])
])
.exec()
.await
.unwrap();
多关联
对于多关联,有 some
、every
和 none
过滤器。
以下示例获取至少有一条内容为“我的内容”的评论且所有标题都为“我的标题”的帖子
use prisma::{post, comment};
let posts: Vec<post::Data> = client
.post()
.find_many(vec![
post::title::equals("My Title".to_string()),
post::comments::some(vec![
comment::content::equals("My Content".to_string())
])
])
.exec()
.await
.unwrap();
请注意,空 some
过滤器将匹配至少有一个关联记录的每个记录,空 none
过滤器将匹配没有关联记录的每个记录。
操作符过滤器
操作符 and
、or
和 not
可用于任何查询中。 prisma_client_rust
库导出 Operator
枚举和来自 prisma_client_rust::operator
的一些辅助函数,它们是使用操作符的一种方式
use prisma::post;
use prisma_client_rust::operator::not;
let posts: Option<post::Data> = client
.post()
.find_first(vec![
not(vec![post::title::id("123".to_string()))
])
.exec()
.await
.unwrap()
但是,这种语法还有待改进,因为所有辅助函数都采用 Vec
类型的过滤器,在查询中留下一堆 vec!
宏。
为了解决这个问题,prisma_client_rust
还从其根目录导出 and!
、or!
和 not!
宏,它们可以代替操作符及其 vec!
use prisma::post;
use prisma_client_rust::not;
let posts: Option<post::Data> = client
.post()
.find_first(vec![
not![post::title::id("123".to_string())]
])
.exec()
.await
.unwrap()
请记住,操作符宏仍然必须在 vec!
内,因为它解析为单个过滤器。