Здравствуйте. Подскажите, пожалуйста, как выбрать записи чата(таблица chat_message) из 3-х таблиц, но чтобы данные из 3-й таблицы(social) попали через поле(soc_id) из промежуточной таблицы(users).
В таблице chat_message в поле user_id хранится id пользователя из таблицы users, в таблице users в поле soc_id хранится id из таблицы social.
схема chat_message:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('chat_message', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
},
user_id: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: {
tableName: 'users',
},
key: 'id'
}
},
message: {
type: DataTypes.STRING,
allowNull: true
}
}, {
sequelize,
tableName: 'chat_message',
schema: 'public'
});
};
схема users:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('users', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
},
soc_id: {
type: DataTypes.INTEGER,
allowNull: true,
defaultValue: 0,
references: {
model: {
tableName: 'social',
},
key: 'id'
}
},
name: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: "NULL"
}
}, {
sequelize,
tableName: 'users',
schema: 'public'
});
};
схема social:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('social', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
},
data: {
type: DataTypes.JSON,
allowNull: true
}
}, {
sequelize,
tableName: 'social',
schema: 'public'
});
};
вызываю так:
models.ChatMessage.belongsTo(models.Users, {foreignKey: 'user_id'});
models.Social.hasOne(models.Users, {foreignKey: 'soc_id'});
let posts = await models.ChatMessage.findAll({
attributes: ['message'],
include: [
{
model: models.Users,
attributes: ['name'],
required: true,
},
{
model: models.Social,
tableName: 'social',
attributes: ['data'],
required: true,
},
],
limit: 10
});
На выходе хочу получить столбцы message, name, data, но при таком вызове появляется error "social is not associated to chat_message", оно и понятно, таблица chat_message и не должна быть связана с social, она ничего не знает про таблицу social, а если убрать из вызова это:
{
model: models.Social,
tableName: 'social',
attributes: ['data'],
required: true,
}
то всё возвращается как надо, кроме столбца data из таблицы social соответственно.