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 错误
在 Laravel/Lighthouse GraphQL API 中实现搜索功能