Prisma:我怎样才能让所有孩子都处于某种状态?

Posted

技术标签:

【中文标题】Prisma:我怎样才能让所有孩子都处于某种状态?【英文标题】:Prisma : how can I get all children on a condition? 【发布时间】:2021-12-17 04:58:59 【问题描述】:

我正在尝试在多对多表(引用自身)上使用 prisma,这样一行将有孩子和孙子

我可以毫无问题地获取所有行,但我正在努力了解如何以可读的 JSON 对数据进行排序,这会阻止前端解析

预期的输出如下:返回的JSON的根只会引用父母,父母会引用他们的孩子,孩子会引用他们自己的孩子

重要提示:我只能返回 enabled = true 的元素

我使用的表称为先行表,并遵循此棱柱模式:

model antecedant 
  id            Int           @id @default(autoincrement())
  name          String
  children      antecedant[]  @relation("antecedant_children")
  parent        antecedant?   @relation("antecedant_children", fields: [parent_id], references: [id])
  parent_id     Int?
  enabled       Boolean       @default(true)
  creation_date DateTime      @default(now())
  update_date   DateTime      @updatedAt

到目前为止,我已经得到了这个:

import  PrismaClient, Prisma  from '@prisma/client'

const prisma = new PrismaClient()

export default async function handler(req, res) 
    const ret = await prisma.antecedant.findMany(
        where: 
            enabled: true,
            parent_id: null
        ,
        include: 
            children: true,
        
    );
    res.status(200).json(ret)

这对父母来说效果很好,但我找不到如何对孩子施加条件(例如 enabled = true )并且它根本不显示孙子

如何以不需要任何解析的方式返回数据?

【问题讨论】:

【参考方案1】:

您可以在include 中添加where 条件以及进行任意级别的嵌套。这就是您的用例的语法

let ret = await prisma.antecedant.findMany(
    where: 
        enabled: true,
        parent_id: null
    ,
    include: 
        children: 
            where: 
                enabled: true,
            ,
            include: 
                children: true  // grandchildren
                // you can pass an object and impose conditions like where:  enabled: true  here as well
            
        ,
    
);

更多信息请参见 Prisma 文档中的 relation queries article。

【讨论】:

以上是关于Prisma:我怎样才能让所有孩子都处于某种状态?的主要内容,如果未能解决你的问题,请参考以下文章

怎样才能长高 让孩子快速长高的好方法

我怎样才能让 Flexbox 孩子 100% 的高度是他们的父母?

我怎样才能等待动画完成然后让代码恢复?

我们怎样才能提到一个提交的孩子?

我怎样才能清理并准备一份我想公开的git repo?

我们怎样才能让 iPhone 屏幕保持活跃,而不是进入省电模式?