在 Postgraphile 中,如何简化 API?

In Postgraphile, How Can I Simplify the API?

使用 Postgraphile,假设我正在查询所有 Foos,即。 allFoosList。假设我的 Foo table 与数据库中的 Bar table 存在多对多关系(即我的 Foos 有 Bars)。

在我的结果中,我将取回一组 Foo 对象。这些对象将有一个 属性,它是一个 Bars 数组。但是,该字段不会是 barsbarsByBarIdList ... 它的名称将类似于 barFoosByFooIdList。该数组中的对象将有一个 barByBarId 属性,它将具有实际的记录值。

我有办法correct/simplify这个吗?

有许多方法,其中一些方法记录在 PostGraphile 的文档中 Relations > Many-to-many relations

Computed column

create function foos_bars(f foos) returns setof bars as $$
  select bars.*
  from bars
  inner join foo_bars
  on foo_bars.bar_id = bars.id
  where foo_bars.foo_id = f.id
$$ language sql stable;

Schema extension

const { makeExtendSchemaPlugin, gql, embed } = require("graphile-utils");

module.exports = makeExtendSchemaPlugin(build => {
  const { pgSql: sql } = build;
  return {
    typeDefs: gql`
      extend type Foo {
        bars: BarsConnection @pgQuery(
          source: ${embed(sql.fragment`bars`)}
          withQueryBuilder: ${embed((queryBuilder, args) => {
            queryBuilder.where(
              sql.fragment`exists(select 1 from foo_bars where foo_bars.bar_id = ${queryBuilder.getTableAlias()}.id and foo_bars.foo_id = ${queryBuilder.parentQueryBuilder.getTableAlias()}.id`
            );
          })}
        )
      }
    `,
  };
});

(性能更高,但更难阅读 - 我们希望将来优化此语法)。

贡献many-to-many plugin

yarn add @graphile-contrib/pg-many-to-many
postgraphile --append-plugins @graphile-contrib/pg-many-to-many

还可以优化命名

我们提供了一个 pg-simplify-inflector 插件,如果您非常确定不会有冲突,可以使用它来简化架构中的名称;如果您的数据库模式定义明确,我强烈建议使用它:

https://github.com/graphile/pg-simplify-inflector