首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Postgraphile中,我如何简化API?

在Postgraphile中,我如何简化API?
EN

Stack Overflow用户
提问于 2020-06-16 09:02:23
回答 1查看 228关注 0票数 2

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

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

有没有办法让我纠正/简化这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-16 23:02:07

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

Computed column

代码语言:javascript
复制
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

代码语言:javascript
复制
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 many-to-many plugin

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62399402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档