You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prisma中skip和take与include联用导致关联数据为空问题

解决Prisma分页查询时关联数据为空的问题

针对你遇到的分页时warehouses_stock始终为空、移除skip/take后正常的情况,可按以下步骤排查解决:

1. 确保分页参数为数字类型

你的代码中skip计算依赖page和limit,如果这两个参数是字符串类型(比如直接从请求URL的查询参数获取),可能导致skip变成字符串,引发分页逻辑异常,取到本身无关联数据的inventory记录。

修改代码,先将参数转为数字:

// 假设从请求参数获取page和limit,根据实际场景调整
const page = parseInt(req.nextUrl.searchParams.get('page') || '1', 10);
const limit = parseInt(req.nextUrl.searchParams.get('limit') || '10', 10);

const inventory = await prisma.inventory.findMany({
  skip: (page - 1) * limit,
  take: limit,
  include: {
    warehouses_stock: true,
  },
});

return NextResponse.json(inventory);

2. 验证模型关联定义是否正确

检查schema.prisma中Inventory和WarehousesStock的关联配置,确保外键和关系指向正确:

model Inventory {
  id               Int                @id @default(autoincrement())
  // 其他业务字段
  warehouses_stock WarehousesStock[]  // 一对多关联
}

model WarehousesStock {
  id           Int        @id @default(autoincrement())
  inventoryId  Int        // 外键字段
  inventory    Inventory  @relation(fields: [inventoryId], references: [id])
  // 其他业务字段
}

同时确认数据库中warehouses_stock表的inventoryId字段值正确,没有为null或指向不存在的inventory记录。

3. 检查分页后记录的实际关联数据

单独查询分页返回的某条inventory记录的关联数据,验证是否真的存在:

// 取分页结果中第一条记录的id(需确保分页结果非空)
if (inventory.length > 0) {
  const testInventoryId = inventory[0].id;
  const stockData = await prisma.warehousesStock.findMany({
    where: { inventoryId: testInventoryId }
  });
  console.log(stockData); // 查看是否有数据
}

如果此查询返回空,说明当前分页的inventory记录本身确实没有关联的库存数据;如果返回正常,可能是Prisma版本存在bug,需要升级。

4. 升级Prisma到最新稳定版

部分旧版本Prisma在分页+关联查询时存在逻辑bug,升级到最新版本可解决:

npm install prisma@latest
npx prisma generate

内容的提问来源于stack exchange,提问作者delfincortesb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:35:22