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

Prisma如何按关联表字段排序用户,同时结合主表字段排序?

解决Prisma关联表字段排序问题

你之前的两种写法都没找对排序的正确方式:

  • 第一种写法是给关联的UserInfo子记录排序,不是对主表User进行排序,完全偏离需求。
  • 第二种写法直接在orderBy里写is_active,但这个字段属于UserInfo表,不是User表的字段,Prisma无法识别,会抛出字段不存在的错误。

正确实现方式

要实现按关联表字段排序,需要通过User模型中定义的UserInfo关联字段来指定排序规则,同时要处理UserInfo为null的情况(没有UserInfo的用户,is_active视为null,降序时默认会排在有UserInfo的用户之后,符合你的需求)。

基础版本代码

const result = await prisma.user.findMany({
  include: {
    UserInfo: true, // 按需包含UserInfo相关字段,也可以用select指定具体字段
  },
  orderBy: [
    // 先按UserInfo的is_active降序排序
    {
      UserInfo: {
        is_active: 'desc',
      },
    },
    // 再按User的name升序排序(如需降序改为'desc')
    {
      name: 'asc',
    },
  ],
});

自定义null值排序位置(Prisma 4.16.0+)

如果需要明确控制没有UserInfo的用户排序位置(比如让这类用户排在最前面),可以使用nulls选项:

const result = await prisma.user.findMany({
  include: {
    UserInfo: true,
  },
  orderBy: [
    {
      UserInfo: {
        is_active: {
          sort: 'desc',
          nulls: 'first', // 让is_active为null的用户排在排序结果最前面
        },
      },
    },
    {
      name: 'asc',
    },
  ],
});

原理说明

Prisma中对关联表字段排序时,必须通过主表中定义的关联字段名(此处为UserInfo)嵌套指定关联表的排序字段,这样Prisma才能正确生成类似你目标SQL的JOIN和ORDER BY逻辑,实现按关联表字段对主表数据排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:17:25