如何使用计算字段对结果集进行排序(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
}
我正在使用 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
}