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`
相关推荐
光影少年17 分钟前
RN 渲染原理:不依赖WebView,原生控件渲染
前端·react native·react.js·前端框架
Excel效率人1 小时前
飞书自动回复机器人开发:@机器人自助查询物流信息
机器人·node.js·飞书
孟无岐1 小时前
LayaAir IDE 插件开发入门:用 TypeScript 给编辑器加一个自己的面板
typescript·游戏开发·工程化·编辑器扩展·layaair·ide 插件
shakingWaves3 小时前
better auth worker on cloudflare
typescript·cloudflare·auth·better-auth
退休倒计时17 小时前
【每日一题】LeetCode 437. 路径总和 III TypeScript
算法·leetcode·typescript
LaughingZhu17 小时前
智能体经典范式构建:ReAct、Plan-and-Solve 与 Reflection
前端·react.js·前端框架
先吃饱再说18 小时前
从“地狱”到“楼梯”再到“同步写法”:Node.js 异步的二十年与Node内置fs模块详解
node.js
飞天狗18 小时前
长列表滚动卡顿怎么破:虚拟列表选型 + react-virtuoso 实战调优指南
react.js·性能优化
知识收割者19 小时前
Nodejs也能写Agent - 10.LangChain篇 - 初识LangChain
node.js
HjhIron20 小时前
Node.js 内置模块之 path 与 fs:从路径拼接到异步演进
node.js·promise