2

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

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

我有办法纠正/简化这个吗?

4

1 回答 1

3

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

计算列

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;

架构扩展

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`
            );
          })}
        )
      }
    `,
  };
});

(这更高效,但更难阅读 - 我们希望将来优化这种语法)。

Contrib多对多插件

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

于 2020-06-16T15:02:06.950 回答