在 Postgraphile 中,如何简化 API?
In Postgraphile, How Can I Simplify the API?
使用 Postgraphile,假设我正在查询所有 Foos,即。 allFoosList
。假设我的 Foo table 与数据库中的 Bar table 存在多对多关系(即我的 Foos 有 Bars)。
在我的结果中,我将取回一组 Foo 对象。这些对象将有一个 属性,它是一个 Bars 数组。但是,该字段不会是 bars
或 barsByBarIdList
... 它的名称将类似于 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
插件,如果您非常确定不会有冲突,可以使用它来简化架构中的名称;如果您的数据库模式定义明确,我强烈建议使用它:
使用 Postgraphile,假设我正在查询所有 Foos,即。 allFoosList
。假设我的 Foo table 与数据库中的 Bar table 存在多对多关系(即我的 Foos 有 Bars)。
在我的结果中,我将取回一组 Foo 对象。这些对象将有一个 属性,它是一个 Bars 数组。但是,该字段不会是 bars
或 barsByBarIdList
... 它的名称将类似于 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
插件,如果您非常确定不会有冲突,可以使用它来简化架构中的名称;如果您的数据库模式定义明确,我强烈建议使用它: