Как сделать запрос API данных Hasura для выборки строк на основе длины значения их отношения массива?

Ссылаясь на образец схемы по умолчанию, упомянутый в https://hasura.io/hub/project/hasura/hello-world/data-apis то есть в следующие две таблицы:

1) автор: идентификатор, имя

2) статья: идентификатор, заголовок, контент, рейтинг, author_id

где article:author_id имеет отношение к массиву author:id,

Как мне сделать запрос, чтобы выбрать авторов, которые написали хотя бы одну статью? В принципе, что-то вроде select author where len(author.articles) > 0

1 ответ

Решение

TL;DR:

Нет никаких length функция, которую вы можете использовать в синтаксисе данных данных Hasura прямо сейчас. Обходной путь 1) Фильтр для свойства, которое гарантированно будет истинным для каждой строки. подобно id > 0, 2) Создайте представление и предоставьте API на свое представление.


Опция 1:

Используйте атрибут "всегда верно" в качестве фильтра.

{
    "type": "select",
    "args": {
        "table": "author",
        "columns": [
            "*"
        ],
        "where": {
            "articles": {
                "id": {
                    "$gt": "0"
                }
            }
        }
    }
}

Это читается как: select all authors where ANY article has id > 0Это работает, потому что id это автоинкрементный int.

Вариант 2:

Создайте представление и затем представьте API данных на них.

Перейдите в окно "Выполнить SQL" в консоли API и запустите миграцию:

CREATE VIEW author_article_count as (
  SELECT au.*, ar.no_articles 
  FROM 
    author au, 
    (SELECT author_id, COUNT(*) no_articles FROM article GROUP BY author_id) ar
  WHERE
    au.id = ar.author_id)

Убедитесь, что вы отметили это как миграцию (флажок под окном Run SQL), чтобы это было добавлено в вашу папку миграций. Теперь добавьте API данных в представление, нажав "Таблица отслеживания" на странице схемы консоли API.

Теперь вы можете делать запросы на выборку, используя no_articles в качестве атрибута длины:

{
    "type": "select",
    "args": {
        "table": "author_article_count",
        "columns": [
            "*"
        ],
        "where": {
            "no_articles": {
                "$gt": "0"
            }
        }
    }
}
Другие вопросы по тегам