我正在从具有多对多关系的嵌套模型中检索数据,该嵌套模型由中间表中的字段排序。
共有三种模型: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
查询数据,则可以按order
中间表中的ProjectImagesTags
字段进行排序。
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不太清楚。如果有人对如何执行此查询有任何想法,我将不胜感激。
答案 0 :(得分:2)
order
属性仅在顶级有效(子查询上的所有排序都将丢失)。
order: [
['order', 'ASC'],
[models.ProjectImages, 'order', 'ASC'],
[models.ProjectImages, models.Tags, models.ProjectImagesTags, 'order', 'ASC'],
],