我正在从具有多对多关系的嵌套模型中检索数据,按中间表中的字段排序。
共有三种模型:Projects
、ProjectImages
和Tags
。
Projects
有自己的 order
字段,并且与另一个模型 ProjectImages
具有一对多关系。 ProjectImages
与 Tags
具有多对多关系。
ProjectImages
和 Tags
之间的中间表是 ProjectImagesTags
,它有一个 order
字段来对显示的标签进行排序。
非常简单。 sequelize 中的模型如下所示:
const Projects = sequelize.define('Projects',
{
order: {
type: DataTypes.INTEGER,
},
title: { type: DataTypes.STRING },
);
Projects.associate = function(models) {
Projects.hasMany(models.ProjectImages);
};
const ProjectImages = sequelize.define('ProjectImages', {
title: { type: DataTypes.STRING },
});
ProjectImages.associate = (models) => {
ProjectImages.belongsToMany(models.Tags, {
through: models.ProjectImagesTags,
});
};
const Tags = sequelize.define('Tags',
{
name: { type: DataTypes.STRING },
},
);
Tags.associate = function(models) {
Tags.belongsToMany(models.ProjectImages, {
through: models.ProjectImagesTags,
});
};
const ProjectImagesTags = sequelize.define('ProjectImagesTags',
{
order: {
type: DataTypes.INTEGER,
},
},
);
现在,如果我从 ProjectImages
查询数据,我可以按 ProjectImagesTags
中间表中的 order
字段进行排序。
models.ProjectImages.findOne({
where: { id: 1 },
include: [
{
model: models.Tags,
},
],
order: [
['order', 'ASC'],
[models.Tags, models.ProjectImagesTags, 'order', 'ASC']
],
})
但是如果我从 Projects
查询,包括 ProjectImages
并尝试使用 [models.Tags, models.ProjectImagesTags, 'order', ' ASC']
和以前一样,不行。
models.Projects.findOne({
where: { id: 1 },
include: [
{
model: models.ProjectImages,
include: [
{
model: models.Tags,
},
],
order: [[models.Tags, models.ProjectImagesTags, 'order', 'ASC']]
},
{
model: models.Tags,
},
],
order: [
['order', 'ASC'],
[models.ProjectImages, 'order', 'asc']
],
})
与 findAll
或 findById
的行为相同。
我尝试了所有可能的组合,包括文字和 docs不是很清楚。如果有人知道如何执行此查询,我将不胜感激。
最佳答案
order
属性仅在顶层有效(子查询上的任何排序都将丢失)。
order: [
['order', 'ASC'],
[models.ProjectImages, 'order', 'ASC'],
[models.ProjectImages, models.Tags, models.ProjectImagesTags, 'order', 'ASC'],
],
关于javascript - Sequelize 不对子嵌套查询排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52838327/