使用引用的表字段作为Laravel Lighthouse中GraphQL模式的参数

时间:2019-07-04 13:52:52

标签: php laravel-5 eloquent graphql

我将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

来帮助我的人。

2 个答案:

答案 0 :(得分:1)

在Lighthouse中,我们通常为此使用eq指令,但我是您的情况,您尝试在关系中的字段中执行where语句。

您可以使用多种方法来执行此操作,最灵活的方法是builder directive。该指令使您可以通过graphql参数在方法中修改查询生成器。在方法中,它将查询生成器和参数值作为方法参数传递。然后,您可以轻松地通过此方法执行需要按用户名过滤的where语句。

另一种方法是将where directiveclause参数一起使用。然后,您将在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")