#sequelize.js
#sequelize.js
Вопрос:
Я застрял, пытаясь разобраться в этом в течение некоторого времени. Я читал, что hasMany
это неправильный подход при попытке создать many-to-many
ассоциацию. У меня есть две таблицы для создания следующей ассоциации User
и Follower
(ужасное имя на данный момент).
Последователь
const follower = (sequelize, DataTypes) => {
const Follower = sequelize.define('follower', {
follower_id: {
type: DataTypes.INTEGER,
allowNull: false,
validate: {
notNull: true
}
},
following_id: {
type: DataTypes.INTEGER,
allowNull: false,
validate: {
notNull: true
}
}
});
return Follower;
};
module.exports = follower;
Далее у нас есть модель пользователя в виде
const user = (sequelize, DataTypes) => {
const User = sequelize.define('user', {
email: {
type: DataTypes.STRING,
unique: true,
allowNull: false,
validate: {
isEmail: true,
notEmpty: true
}
},
password: {
type: DataTypes.STRING,
allowNull: false,
validate: {
notEmpty: true
}
},
username: {
type: DataTypes.STRING,
unique: true,
allowNull: false
}
});
User.associate = (models) => {
User.hasMany(models.post, { foreignKey: 'user_id' });
User.belongsToMany(models.user, {
through: 'users_followers',
foreignKey: 'follower_id',
otherKey: 'following_id',
as: 'followers',
});
User.belongsToMany(models.user, {
through: 'users_followers',
foreignKey: 'following_id',
otherKey: 'follower_id',
as: 'following',
});
return User;
};
module.exports = user;
Я делаю что-то не так в отношении создания ассоциации «многие ко многим»? Я спрашиваю, так как я продолжаю пытаться изменить разницу, но не могу выполнить запрос при попытке include: [db.follower]
Спасибо за всю помощь
Дополнительная информация
Выполняемый запрос:
const fetchUser = async (root, args, context) => {
const { db, user } = await context();
const { id } = args;
const fetchedUser = await db.user.findOne({
attributes: {
include: [
[sequelize.literal('(select count(*) from users_followers where users_followers.follower_id=users.id)'), 'followers_count'],
]
},
include: [
'followers',
'following'
],
where: {
id
},
raw: true
});
return fetchedUser;
Комментарии:
1. Показать запрос, который вы пытаетесь выполнить со многими-ко-многим
2. @Anatoly Спасибо за ответ. В нижней части вопроса я добавил запрос, в котором я выполняю много-ко-многим
Ответ №1:
В include
опции вы всегда должны указывать модель, которая находится на другой стороне определенной ассоциации. В этом случае это User
модель с двумя разными псевдонимами:
include: [
{
model: db.user,
as: 'followers'
}, {
model: db.user,
as: 'following'
}],
Комментарии:
1. Спасибо за эту информацию. Хотя у меня есть два вопроса. В настоящее время он не возвращает никаких значений (информация о подписчиках / подписчиках равна нулю), хотя мой подзапрос возвращает точное количество подписчиков / подписчиков пользователя. Есть ли что-то еще, что мне нужно включить? Я попытался добавить предложение where ко второму и
"column following.follower_id does not exist"
не понял, почему в нем упоминается следующая таблица, когда она должна быть users_followers через . Еще раз спасибо за помощь и указатель.2. Вы можете проверить и сравнить SQL, сгенерированный Sequelize, с вашим собственным SQL