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');
}