【发布时间】:2021-09-11 11:10:52
【问题描述】:
我正在使用 Laravel 和 Lighthouse 包。现在我正在尝试制作一个包含客户撰写的所有评论的列表页面。我可以获取分页评论并为其应用一些过滤器:
- 按评级
- 按客户国籍
- 等等
目前的问题是,我需要按国籍和评分显示有多少评论。
示例:
按评分:
- 5 星 => 1000 条评论
- 4 星 => 455 条评论
- 3 星 => 205 条评论
- 2 星 => 87 条评论
- 1 开始 => 19 条评论
按国籍
- 美国 => 340 条评论
- 法国 => 200 条评论
- 德国 => 450 条评论
一个服务可以供多个客户使用,并且只能由主要客户留下评论。这就是客户未存储在评论表中的原因。客户至少取自三个嵌套关系。
数据库结构:
评论:
- 身份证
- service_id
- 评分
服务:
- 身份证
- 开始日期
- 结束日期
客户服务:
- service_id
- customer_id
- is_primary
客户:
- 身份证
- 姓名
- country_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
并在那里实现 cmets 的计数。
这是我目前的解决方案。很高兴知道其他人如何实现这一点。如果您认为此解决方案可以改进,请随时分享。
【问题讨论】:
-
您能否提供一个您希望运行并获得结果的查询示例?
-
@AlirezaA2F 我用“可能的解决方案”和“我的当前解决方案”部分更新了问题。希望这个回答你的问题。