Laravel Lighthouse - 按关系的属性对查询进行排序

Posted

技术标签:

【中文标题】Laravel Lighthouse - 按关系的属性对查询进行排序【英文标题】:Laravel Lighthouse - Sorting a query by a property of a relationship 【发布时间】:2020-05-12 22:59:20 【问题描述】:

使用像下面这样的架构,有没有办法执行查询并让结果按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 指令,然后在构建器中使用连接以这种方式引入 name 属性,但这似乎会导致实体 ID 出现一些问题,从而导致关系链接到错误东西。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您提到的@builder 是一个很好的解决方案。导致实体 ID 出现问题的问题的修复方法是在您的构建器中传递 ->select('model.*')。这样,它只会返回您要求的模型的数据,并且仍然按关系排序。

【讨论】:

这是拼图中缺失的部分。谢谢!【参考方案2】:

只是为了将问题和接受的答案收集到一个工作示例中,这最终对我有用:

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


【讨论】:

以上是关于Laravel Lighthouse - 按关系的属性对查询进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel Lighthouse 中添加自定义类型和解析器

使用 Laravel Lighthouse 在 Laravel 7 中出现 CORS 错误

嵌套突变似乎在 Lighthouse 3.7 中不起作用

在 Laravel/Lighthouse GraphQL API 中实现搜索功能

Laravel Lighthouse 配置 - 无法找到可发布的资源

如何在lighthouse graphql laravel中获取自定义指令参数?