NextJS开发:Prisma数据库多表关联查询,使用include替代left join

Prisma中的多表关联查询实例

1、schema.prisma中定义模型

typescript 复制代码
model Account {
  @@map("account")
  accountId         Int @id @default(autoincrement()) @map("account_id")
  nickName          String? @db.VarChar(32) @map("nick_name")
  pwd               String? @db.VarChar(128)
  mobile            String? @db.VarChar(11)
  email             String? @db.VarChar(20)
  createAt          DateTime @map("create_at")
  lastLoginAt       DateTime? @map("last_login_at")
  chapters          Chapter[]
}

model Chapter {
  @@map("d_chapter")
  chapterId         BigInt @id @default(autoincrement()) @map("chapter_id")
  account           Account @relation(fields: [accountId], references: [accountId])
  accountId         Int @map("account_id")
  ...
  createAt          DateTime @map("create_at")
  updateAt          DateTime? @map("update_at")
  content           ChapterContent?
}

2、查询操作

typescript 复制代码
let chapters = await Db.share().chapter.findMany({
  orderBy: {
    chapterId: "desc"
  },
  skip: offset,
  take: limit,
  include: {
    account: true
  }
})

3、查看日志中生成sql

复制代码
prisma:query SELECT `nextbbsdb`.`d_chapter`.`chapter_id`, `nextbbsdb`.`d_chapter`.`account_id`, `nextbbsdb`.`d_chapter`.`chapter_type`, `nextbbsdb`.`d_chapter`.`doc_id`, `nextbbsdb`.`d_chapter`.`topic_id`, `nextbbsdb`.`d_chapter`.`pid`, `nextbbsdb`.`d_chapter`.`state`, `nextbbsdb`.`d_chapter`.`type`, `nextbbsdb`.`d_chapter`.`chapter_name`, `nextbbsdb`.`d_chapter`.`thumb`, `nextbbsdb`.`d_chapter`.`file_format`, `nextbbsdb`.`d_chapter`.`keywords`, `nextbbsdb`.`d_chapter`.`intro`, `nextbbsdb`.`d_chapter`.`browse_num`, `nextbbsdb`.`d_chapter`.`reply_num`, `nextbbsdb`.`d_chapter`.`order_no`, `nextbbsdb`.`d_chapter`.`create_at`, `nextbbsdb`.`d_chapter`.`update_at`, `nextbbsdb`.`d_chapter`.`audit_at`, `nextbbsdb`.`d_chapter`.`is_del` FROM `nextbbsdb`.`d_chapter` WHERE `nextbbsdb`.`d_chapter`.`state` = ? ORDER BY `nextbbsdb`.`d_chapter`.`chapter_id` DESC LIMIT ? OFFSET ?
prisma:query SELECT `nextbbsdb`.`account`.`account_id`, `nextbbsdb`.`account`.`type`, `nextbbsdb`.`account`.`nick_name`, `nextbbsdb`.`account`.`pwd`, `nextbbsdb`.`account`.`mobile`, `nextbbsdb`.`account`.`email`, `nextbbsdb`.`account`.`create_at`, `nextbbsdb`.`account`.`last_login_at` FROM `nextbbsdb`.`account` WHERE `nextbbsdb`.`account`.`account_id` IN (?)

通过sql日志可以看出,Prisma是通过两条sql完成的查询,先查出chapter列表,在使用chapter中的主键集合,使用In查询的account,之后再组合数据进行结果返回。

4、如果想要直接使用left join查询,只能使用prisma提供的原始数据库访问方法了

复制代码
const rows = await Db.share().$queryRaw`SELECT a.*,b.nick_name FROM d_chapter a left join account b on a.account_id=b.account_id`
相关推荐
康小旺5 小时前
TypeScript 编译器开始卷 Rust 了:Cloudflare 的 tsrs 到底想干嘛?
rust·typescript
来一首_We_go12 小时前
React Flow Pro 高级交互实现
前端·react.js
weedsfly12 小时前
React 不可变数据:为什么页面“明明数据变了却不更新
前端·javascript·react.js
nyaomaru12 小时前
is-kit 达成 100 Stars ⭐🎉 从 50 到 100,发生了什么?
前端·typescript
随风一样自由13 小时前
【React+TS71007】Next.js “use client” 误用导致 TS71007:客户端/服务端引入问题的完整排查与修复
前端·javascript·react.js
SEO_juper13 小时前
Node.js 全站死链检测工具:从 sitemap 出发一次找全 404
开发语言·人工智能·python·node.js·seo·外贸独立站
ZoeLandia1 天前
React6:组件通信
前端·react.js·typescript
孟陬1 天前
解决动态 import 类型 Any 痼癖
typescript·node.js·bun
Dumbness1 天前
后台管理员把自己锁在门外:RBAC 里「自己的权限只能由别人来减」
安全·node.js
ZoeLandia1 天前
React03:useState 与不可变更新
前端·react.js·typescript·react