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
相关产品推荐
相关产品推荐

