Я извлекаю данные из вложенной модели со отношением "многие ко многим", упорядоченные по полю в промежуточной таблице.
Существуют три модели: 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
.
Я пробовал все возможные комбинации, включая литералы, и документы не очень понятны. Если кто-то имеет представление о том, как сделать этот запрос, я был бы благодарен.
Атрибут order
действителен только на верхнем уровне (любая сортировка в подзапросе будет потеряна).
order: [
['order', 'ASC'],
[models.ProjectImages, 'order', 'ASC'],
[models.ProjectImages, models.Tags, models.ProjectImagesTags, 'order', 'ASC'],
],