gpt4 book ai didi

postgresql - KeystoneJs 用户定义的关系顺序

转载 作者:行者123 更新时间:2023-12-04 08:09:54 26 4
gpt4 key购买 nike

我使用 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",
}

关于如何实现这一点有什么想法吗?

最佳答案

一种方法是有两个“按钮”列表,一个带有按钮模板(下面的buttonTemplate)和通用数据,例如名称等,另一个(button 下面),它引用了一个 buttonTemplate 和一个 form。这允许您为每个 button 分配一个 formIndex 属性,它指示它在相应表单上的位置。

(未经测试)示例代码:

keystone.createList(
'Form',
{
fields: {
name: {
type: Text,
isRequired: true,
},
buttons: {
type: Relationship,
ref: 'Button.form',
many: true,
},
},
}
);

keystone.createList(
'Button',
{
fields: {
buttonTemplate: {
type: Relationship,
ref: 'ButtonTemplate.buttons',
many: false,
},
form: {
type: Relationship,
ref: 'Form.buttons',
many: false,
},
formIndex: {
type: Integer,
isRequired: true,
},
},
}
);

keystone.createList(
'ButtonTemplate',
{
fields: {
name: {
type: Text,
isRequired: true,
},
buttons: {
type: Relationship,
ref: 'Button.buttonTemplate',
many: true,
},
},
}
);

我认为与您的 buttonOrder 解决方案相比,这不太可能让您头疼(我相信您会看到),例如用户删除此字段引用的按钮。

如果您决定采用这种方法,您可以使用 hook functionality 来防止此类问题。在基斯通。例如。在 button 之前是 deleted ,遍历所有表单并重写 buttonOrder 字段,删除对已删除按钮的所有引用。

关于postgresql - KeystoneJs 用户定义的关系顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66034621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com