Здесь есть пара вещей.Во-первых, когда вы используете belongsToMany
, вам нужно выполнить ассоциацию в обеих моделях, потому что это отношение M: N, например: у вас также неверный foreignKey
в ассоциации.Должно быть что-то вроде этого:
User.associate = (models) => {
User.belongsToMany(models.Team, {
through: models.Member,
foreignKey: 'user_id',
})
models.Team.belongsToMany(User, {
through: models.Member,
foreignKey: 'team_id',
})
// ----------------------------------
User.belongsToMany(models.Channel, {
through: 'channel_member',
foreignKey: 'user_id',
})
models.Channel.belongsToMany(user, {
through: 'channel_member',
foreignKey: 'channel_id',
})
}
Теперь, чтобы иметь возможность использовать имена camelCase на javascript и sequelize, а также сохранить snake_case на sql, вы можете сделать это:
module.exports = (sequelize, DataTypes) => {
const Member = sequelize.define('Member', {
// here goes your regular fields
userId: { //now you can use this property on sequelize
field: 'user_id', //and is linked yo the foreignKey
type: DataTypes.INTEGER
},
teamId: {
field: 'team_id',
type: DataTypes.INTEGER
}
}
}
И последняя проблема, с которой вы столкнулись при включении, заключается в том, что вы должны указать, какую ассоциацию вы вызываете, и, как вы сказали, вам нужно объявить ассоциацию другим способом, от User
до DirectMessage
:
User.hasMany(models.DirectMessage, { //there is also hasOne()
as: 'Sender', // this is important because you have two association from User to DirectMessage
foreignKey: 'sender_id',
})
User.hasMany(models.DirectMessage, { //there is also hasOne()
as: 'Receiver', // this is important because you have two association from User to DirectMessage
foreignKey: 'user_id',
})
Теперь вы можете выполнить свой запрос
models.User.findAll({
include:[{
model: models.DirectMessage,
as: 'Sender'
where: {
teamId,
}
}]
}, { raw: true })
У меня есть сомнения по этому вопросу, потому что на самом деле вы называете все DirectMessages
, то есть senderId
и receiverId
фильтр не имеет особого смысла.
В любом случае, надеюсь, с этим есть лучшее представление о том, что делать.