postgresql Prisma:按最新相关型号过滤

6yoyoihd  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(144)

我目前正在PostgreSQL数据库中使用以下Prisma模型:

model Product {
  productId String @id
  name String
  color String
  events ProductEvent[]
  // ...
}

model ProductEvent {
  productEventId String @id
  productId String
  datetime DateTime
  status String
  product Product @relation(fields: [productId], references: [productId])
}

字符串
我希望能够按状态查询我的产品(即,通过ProductEvent的status属性进行过滤,并使用最近的datetime)。
我的查询目前看起来像这样:

await this.client.product.findMany({
  include: {
    events: {
      orderBy: { datetime: "desc" },
      take: 1,
    },
  },
  where: {
    events: {
      some: {
        status: "WHATEVER_STATUS"
      }
    }
  }
});


当然,where子句忽略了include语句中发生的事情,并查看与产品相关的所有事件(不是我想要的)。
有没有一种方法可以强制prisma只使用选定的字段而不是数据库中的所有字段进行过滤?是否有其他方法让我按状态选择产品?

new9mtju

new9mtju1#

您可以通过运行两个单独的查询来实现这一点:
1.查询ProductEvent以查找具有所需状态的最新事件。
1.根据第一个查询中找到的事件的productId查询Product

// Find the most recent event of each product that has the desired status
const latestEvents = await this.client.productEvent.findMany({
  where: {
    status: 'WHATEVER_STATUS',
  },
  orderBy: {
    datetime: 'desc',
  },
  take: 1,
});

// Extract the product IDs from the events
const productIds = latestEvents.map(event => event.productId);

const products = await this.client.product.findMany({
  where: {
    productId: {
      in: productIds,
    },
  },
  include: {
    events: true,
  },
});

字符串

相关问题