排序不对嵌套查询进行排序

时间:2018-10-16 14:53:37

标签: javascript orm sequelize.js

我正在从具有多对多关系的嵌套模型中检索数据,该嵌套模型由中间表中的字段排序。

共有三种模型:ProjectsProjectImagesTagsProjects有自己的order字段,并且与另一个模型ProjectImages有一对多的关系。 ProjectImagesTags有很多关系。 ProjectImagesTags之间的中间表是ProjectImagesTags,它具有一个order字段来对显示的标签进行排序。

Tables

非常简单。 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']
    ],
})

findAllfindById的行为相同。

我尝试了所有可能的组合,包括文字,而docs不太清楚。如果有人对如何执行此查询有任何想法,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

order属性仅在顶级有效(子查询上的所有排序都将丢失)。

order: [
    ['order', 'ASC'], 
    [models.ProjectImages, 'order', 'ASC'],
    [models.ProjectImages, models.Tags, models.ProjectImagesTags, 'order', 'ASC'],
],
相关问题