使用Postgraphile,假设我正在查询所有Foos,即。allFoosList。另外,假设我的Foo表与数据库中的Bar表具有多对多关系(即,我的Foos有栏)。
在我的结果中,我将得到一个Foo对象数组。这些对象将具有一个属性,该属性是条形图的数组。但是,该字段不会是bars或barsByBarIdList ...它将有一个类似于barFoosByFooIdList的名称。该数组中的对象将具有一个barByBarId属性,该属性将具有实际的记录值。
有没有办法让我纠正/简化这个问题?
发布于 2020-06-16 23:02:07
有许多方法,其中几种记录在Relations > Many-to-many relations下的PostGraphile文档中。
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 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://stackoverflow.com/questions/62399402
复制相似问题