在 Laravel Lighthouse 中添加自定义类型和解析器

Posted

技术标签:

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

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

【讨论】:

我不确定应该如何使用@withCount。你能给我一些例子吗? 您的模型中需要有一个关系来返回相关模型的实例。这将有助于查看 @withCount lighthouse-php.com/master/api-reference/directives.html 以查看示例

以上是关于在 Laravel Lighthouse 中添加自定义类型和解析器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel Lighthouse 在 Laravel 7 中出现 CORS 错误

变异中的 Laravel LightHouse GraphQL DateTime 输入始终为空

Laravel Lighthouse 配置 - 无法找到可发布的资源

在 Laravel/Lighthouse GraphQL API 中实现搜索功能

Laravel Lighthouse 中的授权

Laravel Lighthouse GraphQL - 在服务器端排序