如何解决在 Laravel Lighthouse 中添加自定义类型和解析器
我正在使用 Laravel 和 Lighthouse 包。现在我正在尝试制作一个包含客户撰写的所有评论的列表页面。我可以查看分页评论并为其应用一些过滤器:
- 按评分
- 按客户国籍
- 等等
当前的问题是我需要显示按国籍和评级撰写的评论数量。
示例:
按评分:
- 5 颗星 => 1000 条评论
- 4 星 => 455 条评论
- 3 星 => 205 条评论
- 2 星 => 87 条评论
- 1 个开始 => 19 条评论
按国籍
- 美国 => 340 条评论
- 法国 => 200 条评论
- 德国 => 450 条评论
一项服务可供多个客户使用,评价只能由主要客户发表。这就是为什么客户没有存储在评论表中的原因。客户来自至少三个嵌套关系。
数据库结构:
评论:
- id
- service_id
- 评分
服务:
- id
- 开始日期
- 结束日期
客户服务:
- service_id
- customer_id
- is_primary
客户:
- id
- 姓名
- country_id
国家:
- id
- 姓名
我想添加一个名为 ReviewCountByRating 和 ReviewCountByNationality 的新类型,其中包含将运行查询并获取信息的自定义解析器。类似于 Lighthouse 中的 PaginatorInfo。
这是我使用 GraphQl 和 Lighthouse 的第一个项目,但我找不到如何实现它的示例。
可能的解决方案
我还希望应用的所有过滤器和范围都对计数产生影响。所以我认为最好的解决方案是进行这样的查询:
reviews{
data{
id
rating
}
countBy(attribute: "rating"){
attribute
count
}
countBy(attribute: "country.id"){
id
count
}
}
尽管我希望它以这种方式工作,但我认为如果我们添加 @paginate 指令,这看起来不可能/很难实现。
我目前的解决方案
所以我认为最好的办法是有一个单独的查询,该查询将返回一个 CountById 或 CountByAttribute 的 graphQl 类型。以下是我在架构中描述它们的方式:
type CountById {
id: ID
count: Int
}
type CountByAttribute {
attribute: String
count: Int
}
我们将需要这两种类型,因为当我们按评级计算评论时,我们按评级字段对它们进行分组/计数。但是当我们计算一个国家的评论时(在我的例子中女巫是一种关系)将它们按关系的 id 分组而不是国家的名称会很好。 然后我在 GraphQl 模式中添加一个自定义查询,该查询将返回此信息。
type Query {
....
reviewCountByRating: [CountByAttribute]
reviewCountByCountry: [CountById]
...
}
然后我运行这两个工匠命令来为添加的查询创建解析器:
php artisan lighthouse:query ReviewCountByRating
php artisan lighthouse:query ReviewCountByCountry
并在那里实现评论计数。
这是我目前的解决方案。很高兴知道其他人如何实现这一点。如果您认为此解决方案可以改进,请随时分享。
解决方法
如果您想在分页器信息中或旁边添加一个字段,我想您需要制定自己的指令,例如@customPaginate
。一种更简单的方法是向每一行添加一个字段并在那里进行计数,但为了避免出现 N+1
查询问题,我建议使用 @withCount
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。