Prisma:在多个条件下选择多对多

Posted

技术标签:

【中文标题】Prisma:在多个条件下选择多对多【英文标题】:Prisma : select on many to many with multiple conditions 【发布时间】:2021-12-26 19:14:53 【问题描述】:

我有两个表 UserPost 由自定义多对多表链接,例如:

model User 
  id            Int      @id @default(autoincrement())
  name          String
  enabled       Bool
  posts         users_to_posts[]


model Post 
  id            Int      @id @default(autoincrement())
  name          String
  enabled       Bool
  users         users_to_posts[]


model user_to_post 
  user          user? @relation(fields: [user_id], references: [id])
  user_id       Int
  post          post? @relation(fields: [post_id], references: [id])
  post_id       Int
  @@id([user_id, post_id])

我正在尝试根据必须启用用户和帖子的帖子 ID 列表获取用户列表。

到目前为止,如果他们在给定的帖子数组中有帖子,我可以获得已启用的正确用户,但我无法检查帖子是否已启用,也无法过滤帖子(我得到所有帖子如果匹配,则与用户关联)

这是我拥有的(几乎)工作代码:

import  PrismaClient, Prisma  from '@prisma/client'

const prisma = new PrismaClient()

export default async function handler(req, res) 
    if (req.method !== 'POST') 
        res.status(400).send( message: 'Only POST requests allowed for this route' )
     else 
        const  posts_id  = req.query
        const posts_array = posts_id.split(",").map(function(item) 
            return parseInt(item)
        )
        const ret = await prisma.user.findMany(
            where: 
                enabled: true,
                post:  some:  post_id:  in: posts_array  , ,
            ,
            include: 
                _count:  select:  post: true  
                post:  select:  post: true , ,
            ,
        )
        res.status(200).send(ret)
        // ...
    

我仍在努力了解如何在不依赖打字稿的情况下进行多个嵌入式选择以使查询正常工作(女巫远非理想)

【问题讨论】:

【参考方案1】:

据我了解,您需要的 2 个约束目前未在您的查询中表示。

    如果posts_array 内的帖子已启用,则仅返回user。 过滤 user 的返回帖子,使其仅包含 enabled 帖子。

我已更新您的查询以添加这两个条件。

const users = await prisma.user.findMany(
    where: 
        enabled: true,
        posts: 
            some: 
                post_id:  in: posts_array ,
                post:   
                    enabled: true  // for constraint 1 (only check/match against the post_ids in post array which are enabled)
                
            ,
        ,

    ,

    include: 
        _count:  select:  posts: true  ,
        posts: 
            select:  post: true ,
            where: 
                post:   
                    enabled: true   // for constraint 2 (only include the posts which are enabled)
                
            
        ,
    ,
)

请记住,users[SOME_IDX]._count.posts 将包含该用户所有帖子的计数(包括disabled 的帖子)。如果您只想计算已启用帖子的数量,则必须检查 users[SOME_IDX].posts 数组的长度。

顺便说一下,根据您的架构,user_to_post 表有些多余。您可以使用implicit many-to-many 来模拟帖子和用户之间的关系。

【讨论】:

以上是关于Prisma:在多个条件下选择多对多的主要内容,如果未能解决你的问题,请参考以下文章

Nextjs / prisma:我可以手动命名多对多表吗?

hibernate多对多查询

Prisma:在显式多对多关系中创建或连接记录

从 Prisma 中的多对多表中获取元信息

更新 Prisma 中的多对多关系

Prisma 多对多关系查询