Я получаю данные из вложенной модели с отношением «многие ко многим», упорядоченной по полю в промежуточной таблице.
Существует три модели: 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
.
Я перепробовал все возможные комбинации, включая литералы, и документы не очень понятны.Если у кого-то есть идея о том, как сделать этот запрос, я был бы признателен.