如何使用计算字段对结果集进行排序(type-graphql)

How to sort result set using computed fields (type-graphql)

我正在使用 type-graphql 和 typeorm。有没有一种方法可以根据计算字段对结果进行排序。具体来说,我想 return 一个客户列表,并根据计算字段对列表进行排序:“sortName”。排序名称只是客户端的“firstName lastName”或“lastName FirstName”的字符串。关于如何生成 sortName 的决定基于公司 table 中的标志(这样用户可以控制他们希望如何查看他们的客户)。我只是不知道如何在发送回前端应用程序之前进行排序。我知道我可以创建视图并在 sql 中执行 - 但我想知道是否可以在代码中执行。

import {Arg, Ctx, Field, FieldResolver, ID, InputType, ObjectType, Query, Resolver, Root,} from 'type-graphql'
import {Client} from '../entities/Client'
import {ClientNameSort, Company} from '../entities/Company'
import {MyContext} from '../types/MyContext'

@InputType()
export class ClientsOptions {
  @Field(() => ID)
  companyId!: string
}


@ObjectType()
@Resolver(Client)
export class ClientResolver {

  @FieldResolver(() => String)
  async sortName(@Root() client: Client, @Ctx() { companyLoader }: MyContext) {

    const company:Company = await companyLoader.load(client.companyId)

    if (!company) {
      throw new Error(`Missing rec for Company Id ${client.companyId}`)
    }

    if (company.clientNameSort === ClientNameSort.FIRST_NAME) {
      return `${client.firstName} ${client.lastName} ${client.id}`
    } else {
      return `${client.lastName} ${client.firstName} ${client.id}`
    }
  }
  

  @Query(() => [Client])
  async clients(@Arg('options') options: ClientsOptions) {
    const clientList =  await Client.find({ where: { companyId: options.companyId } })
    return clientList;
  }
}

我相信您必须对“客户”方法进行排序。因此我不确定现场解析器是否会帮助你。你最好把它分离成一个效用函数并在两种方法中重用它。

关于客户端排序方法:

  • 如果您使用 mongodb,也许您可​​以执行聚合查询来创建此虚拟字段并按其排序
  • 如果你使用其他数据库,你将不得不看看他们是否有这种功能

如果你不想通过数据库排序,你可以获取客户端数组并进行排序

clients.sort((a,b) => sortByCompanyName(company.CLIENT_NAME_SORT, a, b))

getFullIdentificator(order, client) {
  if (order === ClientNameSort.FIRST_NAME) {
      return `${client.firstName} ${client.lastName} ${client.id}`
    } else {
      return `${client.lastName} ${client.firstName} ${client.id}`
    }
}
sortByCompanyName(order, prev, next) {
  return getFullIdentificator(order, prev) >  getFullIdentificator(order, next) ? 1 : -1 
}