Используйте поле таблицы со ссылкой в ​​качестве аргумента для схемы GraphQL в Laravel Lighthouse - PullRequest
1 голос
/ 04 июля 2019

Я использую 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

Ответы [ 2 ]

1 голос
/ 18 июля 2019

В Lighthouse мы обычно используем для этого директиву eq, но в вашем случае вы пытаетесь сделать оператор where из поля отношений.

Вы можете сделать это несколькими способами, наиболее гибким является директива builder .Эта директива позволяет вам модифицировать построитель запросов в методе из аргумента graphql.В методе он передает конструктор запросов и значения аргументов в качестве аргументов метода.Затем вы можете легко в этом методе выполнить оператор where, который необходимо отфильтровать по имени пользователя.

Другой подход заключается в использовании директивы where вместе с аргументом clause.Тогда значение, которое вы указали бы в аргументе clause, будет областью действия, которая фильтруется по имени пользователя.Эта область будет получать динамическое значение, введенное в предоставленный аргумент graphql.

Логика фильтрации будет одинаковой в обоих подходах и будет выглядеть примерно так:

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

0 голосов
/ 18 июля 2019

Мне удалось заставить это работать после того, как я следовал совету @ 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")
...