读取数据
查找查询

查找查询

示例使用以下模式

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()

关联过滤

关联过滤的方式与标量过滤类似,只是需要一些额外的函数。

单一关联

对于单一关联,有 isis_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();

多关联

对于多关联,有 someeverynone 过滤器。

以下示例获取至少有一条内容为“我的内容”的评论且所有标题都为“我的标题”的帖子

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 过滤器将匹配没有关联记录的每个记录。

操作符过滤器

操作符 andornot 可用于任何查询中。 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! 内,因为它解析为单个过滤器。