1

我正在使用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
        }
    }
}

我有两个正确定义关系的 Eloquent 模型。

我不知道如何获得username作者的文章列表。查询应如下所示

{
    articles(username: "joebloggs") {
        data {
            title
        }
    }
}

我猜任何不熟悉 Laravel 但知道 GraphQL 的人仍然可以通过参考Lighthouse Directives来帮助我

4

2 回答 2

2

在遵循@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")
于 2019-07-18T05:50:54.773 回答
1

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

你可以用几种方法做到这一点,最灵活的是builder指令。该指令让您可以在来自 graphql 参数的方法中修改查询构建器。在方法中,它将查询构建器和参数值作为方法参数传递。然后,您可以轻松地在此方法中执行您需要按用户名过滤的 where 语句。

另一种方法是将where指令clause参数一起使用。然后,您将在clause参数中提供的值将是一个按用户名过滤的范围。此范围将获取在提供的 graphql 参数中输入的动态值。

过滤的逻辑在两种方法中都是相同的,看起来像下面这样

$articlesQuery->whereHas('author' function (Builder $query) use ($username) {
    $query->where('username', '=', $username);
});

于 2019-07-18T05:45:29.117 回答