【问题标题】:Add a custom type and resolver in Laravel Lighthouse在 Laravel Lighthouse 中添加自定义类型和解析器
【发布时间】: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 我用“可能的解决方案”和“我的当前解决方案”部分更新了问题。希望这个回答你的问题。

标签: laravel-lighthouse


【解决方案1】:

如果您想在分页器信息或旁边添加一个字段,我想您需要制作自己的指令,例如@customPaginate。一种更简单的方法是在每一行中添加一个字段并在那里进行计数,但为了避免出现N+1 查询问题,我建议使用@withCount。

【讨论】:

猜你喜欢
  • 2021-12-22
  • 2019-09-29
  • 2020-10-04
  • 2021-10-05
  • 2020-04-15
  • 1970-01-01
  • 2021-07-28
  • 2016-01-13
  • 1970-01-01
相关资源
最近更新 更多