Laravel Lighthouse - 按 属性 关系对查询进行排序
Laravel Lighthouse - Sorting a query by a property of a relationship
对于如下所示的模式,是否有一种方法可以执行查询并将结果按 JobType
实体的 name
属性 排序?我想要一个分页的工作列表,并显示按工作类型名称字母顺序排序的结果。
extend type Query @middleware(checks: ["auth:api"]) {
jobs(orderBy: _ @orderBy): [Job!]! @paginate(defaultCount: 10, model: "App\Job")
}
type Job {
id: ID!
description: String!
job_type: JobType! @belongsTo
}
type JobType {
id: ID!
name: String!
}
我试过使用 @builder
指令,然后在构建器中使用连接以这种方式引入名称 属性,但这似乎会导致实体 ID 出现一些问题,这导致关系 link 错误。
有什么想法吗?
您提到的 @builder
是一个很好的解决方案。解决导致实体 ID 问题的问题的方法是在构建器中传递 ->select('model.*')
。这样它只会 return 您要求的模型的数据,并且仍然按关系排序。
只是为了将问题和接受的答案收集到一个工作示例中,这就是最终对我有用的:
GraphQL:
extend type Query @middleware(checks: ["auth:api"]) {
jobs(@builder(method: "App\Models\Job@jobsInOrder")): [Job!]! @paginate(defaultCount: 10, model: "App\Job")
}
type Job {
id: ID!
description: String!
job_type: JobType! @belongsTo
}
type JobType {
id: ID!
name: String!
}
Job.php:
public function jobsInOrder(Builder $builder): Builder
{
// Connect the events with their date_times
return $builder->join('job_types', 'jobs.id', '=', 'job_types.job_id')
->select('jobs.*')
->orderBy('job_types.name');
}
对于如下所示的模式,是否有一种方法可以执行查询并将结果按 JobType
实体的 name
属性 排序?我想要一个分页的工作列表,并显示按工作类型名称字母顺序排序的结果。
extend type Query @middleware(checks: ["auth:api"]) {
jobs(orderBy: _ @orderBy): [Job!]! @paginate(defaultCount: 10, model: "App\Job")
}
type Job {
id: ID!
description: String!
job_type: JobType! @belongsTo
}
type JobType {
id: ID!
name: String!
}
我试过使用 @builder
指令,然后在构建器中使用连接以这种方式引入名称 属性,但这似乎会导致实体 ID 出现一些问题,这导致关系 link 错误。
有什么想法吗?
您提到的 @builder
是一个很好的解决方案。解决导致实体 ID 问题的问题的方法是在构建器中传递 ->select('model.*')
。这样它只会 return 您要求的模型的数据,并且仍然按关系排序。
只是为了将问题和接受的答案收集到一个工作示例中,这就是最终对我有用的:
GraphQL:
extend type Query @middleware(checks: ["auth:api"]) {
jobs(@builder(method: "App\Models\Job@jobsInOrder")): [Job!]! @paginate(defaultCount: 10, model: "App\Job")
}
type Job {
id: ID!
description: String!
job_type: JobType! @belongsTo
}
type JobType {
id: ID!
name: String!
}
Job.php:
public function jobsInOrder(Builder $builder): Builder
{
// Connect the events with their date_times
return $builder->join('job_types', 'jobs.id', '=', 'job_types.job_id')
->select('jobs.*')
->orderBy('job_types.name');
}