【发布时间】:2021-05-08 02:29:35
【问题描述】:
我使用 KeystoneJS 和 PostgreSQL 作为我的后端,并在我的应用程序的前端使用 Apollo。 我有一个架构,它有一个链接到另一个列表的列表。 我希望能够允许用户更改第二个列表的顺序。
这是我的架构的简化版本
keystone.createList(
'forms',
{
fields: {
name: {
type: Text,
isRequired: true,
},
buttons: {
type: Relationship,
ref: 'buttons.attached_forms',
many: true,
},
},
}
);
keystone.createList(
'buttons',
{
fields: {
name: {
type: Text,
isRequired: true,
},
attached_forms: {
type: Relationship,
ref: 'forms.buttons',
many: true,
},
},
}
);
所以我想做的是允许用户更改按钮的顺序,以便将来从表单中获取它们时:
const QUERY = gql`
query getForms($formId: ID!) {
allforms(where: {
id: $formId,
}) {
id
name
buttons {
id
name
}
}
}
`;
按钮应该以预定义的顺序从后端返回。
{
id: 1,
name: 'Form 1',
buttons: [
{
id: 1,
name: 'Button 1',
},
{
id: 3,
name: 'Button 3',
},
{
id: 2,
name: 'Button 2',
}
]
}
或者甚至只是在查询中返回一些数据,这些数据将允许根据前端用户定义的排序顺序进行排序。
关键是这种关系是多对多的。
因此,将列添加到按钮架构是不够的,因为排序需要特定于关系。换句话说,如果用户将特定按钮放在特定表单的最后,则不应更改该按钮在其他表单上的顺序。
在我自己创建的后端中,我会在连接表中添加一些内容,例如 sortOrder 字段或类似字段,然后更改这些值以更改顺序,甚至使用该信息在前端对它们进行排序。
像this answer here 这样的东西。
多对多连接表将包含 formId、buttonId、sortOrder 等列。
我一直在深入研究 KeystoneJS 的文档,但如果不涉及覆盖我们正在使用的 KnexAdapter 的杂草,我想不出一种方法来完成这项工作。
我正在使用:
{
"@keystonejs/adapter-knex": "^11.0.7",
"@keystonejs/app-admin-ui": "^7.3.11",
"@keystonejs/app-graphql": "^6.2.1",
"@keystonejs/fields": "^20.1.2",
"@keystonejs/keystone": "^17.1.2",
"@keystonejs/server-side-graphql-client": "^1.1.2",
}
对我如何实现这一点有什么想法吗?
【问题讨论】:
标签: postgresql graphql keystonejs