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`