Sequelize не упорядочивать по поднесенному запросу

1

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

Существуют три модели: Projects, ProjectImages и Tags. Projects имеют свое собственное поле order и имеют отношения "один ко многим" с другой моделью ProjectImages. ProjectImages имеет много-много отношений, с Tags. Промежуточная таблица между ProjectImages и Tags - ProjectImagesTags, и у нее есть поле order для сортировки показанных тегов.

Изображение 174551

Смертельно простой. Модели в 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.

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

Теги:
sequelize.js
orm

1 ответ

2
Лучший ответ

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

order: [
    ['order', 'ASC'], 
    [models.ProjectImages, 'order', 'ASC'],
    [models.ProjectImages, models.Tags, models.ProjectImagesTags, 'order', 'ASC'],
],
  • 2
    Хм, я вижу ... поэтому я должен объявить заказы на первом уровне; и в объявлении заказа я должен сослаться на первую вложенную модель, а также на вторую вложенную модель, а также на промежуточную таблицу. Оно работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню