Buenas noches.
Tengo una base de datos con la siguiente asociación N:N:
-> BlogPost.belogsToMany(Categoría a través de: PostsCategories)
-> Category.belongsToMany(BlogPost a través de: PostsCategories)
PostsCategories es el modelo de la tabla de unión.
En el proceso de insertar un BlogPost en la base de datos, tengo que catalogar en qué categorías se encuentra en la tabla de conexiones. Entonces, siguiendo algunos ejemplos en la documentación que se me ocurrió:
const blogPost = await BlogPost.create({ title, content, userId }); await blogPost.addCategories(categoriesList);
Hasta aquí todo bien, pero hubo un error. Básicamente, Sequelize está invirtiendo el orden en las columnas/valores al escribir la consulta. si agrego
blogPost: { id: 3, categories: [1, 2] }
produce esta consulta:
"'INSERT INTO `PostsCategories` (`categoryId`,`postId`) VALUES (3,1),(3,2);'"
Está invertido y he intentado un montón de cosas y no funciona. :(
Tiene alguna idea sobre esto?
¡Gracias!
EDITAR: MIS MODELOS
module.exports = (sequelize, DataTypes) => { const Category = sequelize.define('Category', { name: DataTypes.STRING, }, { tableName: 'Categories', timestamps: false }); Category.associate = (models) => { const { BlogPost, PostsCategories } = models; Category.belongsToMany( BlogPost, { through: PostsCategories, foreignKey: 'postId', as: 'blogPosts' }, ); }; return Category; }; module.exports = (sequelize, DataTypes) => { const BlogPost = sequelize.define('BlogPost', { title: DataTypes.STRING, content: DataTypes.STRING, userId: DataTypes.INTEGER, }, { tableName: 'BlogPosts', timestamps: true, createdAt: 'published', updatedAt: 'updated' }); BlogPost.associate = (models) => { const { User, PostsCategories, Category } = models; BlogPost.belongsToMany( Category, { through: PostsCategories, foreignKey: 'categoryId', as: 'categories' }, ); BlogPost.belongsTo(User, { foreignKey: 'userId', as: 'user' }); }; return BlogPost; }; module.exports = (sequelize, _DataTypes) => { const PostsCategories = sequelize.define('PostsCategories', {}, { timestamps: false, tableName: 'PostsCategories' }); return PostsCategories; };
Recibí mi respuesta. Jajaja.
Mis declaraciones de asociación eran defectuosas.
BlogPost.belongsToMany( Category, { through: PostsCategories, foreignKey: 'categoryId', as: 'categories' }, );
En realidad, ForeignKey está relacionado con BlogPost en la tabla de unión.
También invertí mi declaración para poder "leerla" mejor.
BlogPost.belongsToMany( Category, { as: 'categories', through: PostsCategories, foreignKey: 'postId' }, );
BlogPost pertenece a muchos Categoría