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`
相关推荐
猿来如此呀39 分钟前
运行npm install 时,卡在sill idealTree buildDeps没有反应
前端·npm·node.js
八了个戒4 小时前
Koa (下一代web框架) 【Node.js进阶】
前端·node.js
谢尔登14 小时前
【Node.js】RabbitMQ 不同交换器类型的使用
node.js·rabbitmq·ruby
weixin_4410183516 小时前
webpack的热更新原理
前端·webpack·node.js
懒大王952716 小时前
Node.js 多版本安装与切换指南
node.js
B.-1 天前
Remix 学习 - @remix-run/react 中主要的 hooks
前端·javascript·学习·react.js·web
盼盼盼1 天前
如何避免在使用 Context API 时出现状态管理的常见问题?
前端·javascript·react.js
程序员小羊!1 天前
切换淘宝最新镜像源npm详细讲解
前端·npm·node.js
小白小白从不日白1 天前
react 动画_样式处理
前端·react.js
图灵苹果1 天前
【个人博客hexo版】hexo安装时会出现的一些问题
前端·前端框架·npm·node.js