【问题标题】:Laravel Lighthouse - Sorting a query by a property of a relationshipLaravel Lighthouse - 按关系的属性对查询进行排序
【发布时间】: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 出现一些问题,从而导致关系链接到错误东西。

有什么想法吗?

【问题讨论】:

    标签: php laravel graphql laravel-lighthouse


    【解决方案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');
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 2022-01-22
      • 2021-10-10
      • 1970-01-01
      相关资源
      最近更新 更多