我将nuwave/lighthouse与Laravel一起使用来创建GraphQL API,并且有以下两个表
Authors
----------
id
username
name
Articles
--------
id
author_id
title
我可以使用以下模式通过author_id
获取属于作者的文章列表
type Query {
articles(author_id: Int! @eq): Article @all
}
type Author {
id: ID!
username: String!
name: String!
articles: [Article!]! @hasMany
}
type Article {
id: ID!
author_id: ID!
title: String!
author: Author! @belongsTo
}
查询为
{
articles(author_id: 1) {
data {
title
}
}
}
我有两个口才恰当的模型。
我不知道如何通过作者的username
获取文章列表。查询应如下所示
{
articles(username: "joebloggs") {
data {
title
}
}
}
我猜想是任何不熟悉Laravel但知道GraphQL仍然可以通过参考Lighthouse Directives
来帮助我的人。答案 0 :(得分:1)
在Lighthouse中,我们通常为此使用eq
指令,但我是您的情况,您尝试在关系中的字段中执行where语句。
您可以使用多种方法来执行此操作,最灵活的方法是builder
directive。该指令使您可以通过graphql参数在方法中修改查询生成器。在方法中,它将查询生成器和参数值作为方法参数传递。然后,您可以轻松地通过此方法执行需要按用户名过滤的where语句。
另一种方法是将where
directive与clause
参数一起使用。然后,您将在clause
参数中提供的值将成为一个按用户名过滤的范围。此范围将获得在提供的graphql参数中输入的动态值。
两种方法中要过滤的逻辑相同,并且看起来类似于以下内容
$articlesQuery->whereHas('author' function (Builder $query) use ($username) {
$query->where('username', '=', $username);
});
答案 1 :(得分:0)
按照@OliverNybroe的建议,我设法使它正常工作
在belongsToAuthor
模型中添加了Article
方法
public function belongsToAuthor($builder, $username)
{
return $builder->where('id',
Author::where('username', $username)->first()->id
);
}
模式中的查询看起来像
articles(username: String! @builder (method: "App\\Article@belongsToAuthor")): [Article!]! @paginate(type: "paginator" model: "App\\Article")