你能对另一个模型中的模型列表应用排序吗?



使用AWS Amplify,我们可以对Conversation模型中的消息应用排序吗?在获取会话时,最好根据生成的createdAt日期对消息进行排序。

这些是目前使用的模型。

type Conversation @model {
id: ID!
messages: [Message!]! @hasMany
...
}
type Message @model {
id: ID!
authorId: String!
content: String!
conversation: Conversation @belongsTo
}

理想情况下希望将排序放在hasMany指令上,但这是不可能的。

type Conversation @model {
id: ID!
messages: [Message!]! @hasMany(sortKeys:['createdAt'])
...
}

createdAt上使用排序字段创建Message模型上的二级索引。

type Message @model {
id: ID!
authorId: String! @index(name: "byAuthorId", queryField: "getMessagesByAuthorId", sortKeyFields: [ "createdAt" ])
content: String!
conversation: Conversation @belongsTo
}

Amplify创建了一个新的查询来获取消息并应用排序。下面的示例使用react-query通过排序从authorId中获取消息。

export function useMessagesPerAuthorId({
id,
filter,
enabled = true,
}: {
id: string | undefined;
filter: any;
enabled?: boolean;
}) {
return useQuery(
['conversations', 'messages', id, filter],
() => fetchMessagesByAuthorId({ id: id!, filter }),
{ enabled: enabled && !!id }
);
}
async function fetchMessagesByAuthorId({ id, filter }: { id: string; filter: any }) {
const query: any = await API.graphql({
query: getMessagesByAuthorId,
variables: { authorId: id, sortDirection: 'DESC', filter },
});
const data: Message[] = query.data?.getMessagesByAuthorId.items;
return data;
}

现在我们可以在视图组件中调用这个钩子并传递过滤器了。

const { isLoading, data: messages = [] } = useMessagesPerAuthorId({
id: profile?.id,
filter: {
and: [{ conversationMessagesId: { eq: conversationId } }, { deleted: { eq: false } }],
},
enabled: !!profile?.id,
});

相关内容

  • 没有找到相关文章

最新更新