Sequelize не упорядочивать по поднесенному запросу - PullRequest
0 голосов
/ 16 октября 2018

Я получаю данные из вложенной модели с отношением «многие ко многим», упорядоченной по полю в промежуточной таблице.

Существует три модели: Projects, ProjectImages и Tags.Projects имеет собственное поле order и имеет отношение один ко многим с другой моделью, ProjectImages.ProjectImages имеет отношение многие ко многим, с Tags.Промежуточная таблица между ProjectImages и Tags равна 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']
    ],
})

То же поведение с findAll или findById.

Я перепробовал все возможные комбинации, включая литералы, и документы не очень понятны.Если у кого-то есть идея о том, как сделать этот запрос, я был бы признателен.

1 Ответ

0 голосов
/ 16 октября 2018

Атрибут order действителен только на верхнем уровне (любая сортировка в подзапросе будет потеряна).

order: [
    ['order', 'ASC'], 
    [models.ProjectImages, 'order', 'ASC'],
    [models.ProjectImages, models.Tags, models.ProjectImagesTags, 'order', 'ASC'],
],
...