У меня проблемы с пониманием документации сиквелиза, касающейся отношений "принадлежит многим". Мне удалось правильно настроить его в самой БД, но теперь, когда я хочу выполнить базовую операцию CRUD, я совершенно потерялся.
Итак, вот что: у меня есть пользователи и чаты. Каждый раз, когда пользователь создает чат, я хочу, чтобы он был владельцем комнаты, а также участником.
Проблема в том ... Я не могу понять, как добавить этого пользователя к участнику. Что касается БД, есть таблица chatroom_user, которая содержит идентификаторы пользователей и идентификаторы чатов. Из того, что я понял из документации по sequelize, мне нужно создать функцию addXXXXX в моей модели, добавить ее вызов в преобразователе с требуемыми аргументами ... но это не сработает ...
вот мой код
модель чата:
export default (sequelize, Datatypes) => {
const Chatroom = sequelize.define('chatroom', {
publicRoom: {
type: Datatypes.BOOLEAN,
allowNull: false
},
});
Chatroom.associate = (models) => {
Chatroom.belongsTo(models.user, {
foreignKey: {
name: 'owner',
allowNull: false
}
});
Chatroom.belongsToMany(models.user, {
through: 'user_chatroom',
foreignKey: {
name: 'chatroom',
allowNull: false
},
onDelete: 'CASCADE'
});
Chatroom.addUsers(models.user);
};
преобразователи чатов:
export default {
Query: {
// some queries here...
},
Mutation: {
createChatroom: async (parent, args, {models, user}, info) => {
try {
return await models.chatroom.create({owner: user.id})
.then(models.chatroom.addUsers(user.id));
} catch (err) {
console.info(err);
}
},
}
};
Так что да, я знаю, что это определенно не способ сделать это, но я просмотрел много руководств и не нашел рабочих решений ... :(
"владелец" отсутствует в таблице chatroom_user. В нем только ID пользователя и ID чата. Владелец - столбец, содержащий идентификаторы пользователей в таблице "чат".





Я могу предложить вам следующее: удалить владельца из чата и переместить владельца в таблицу соединений, в вашем случае - в таблицу chatroom_user.
export default (sequelize, DataTypes) => {
const Chatroom = sequelize.define('chatroom', {
name: DataTypes.STRING,
publicRoom: {
type: Datatypes.BOOLEAN,
allowNull: false
},
});
Chatroom.associate = (models) => {
Chatroom.belongsToMany(models.User, {
through: 'user_chatroom',
foreignKey: {
name: 'userId',
field: 'user_id',
},
});
};
return Chatroom;
};
затем в таблице UserChatroom
export default (sequelize, DataTypes) => {
const UserChatroom = sequelize.define('user_chatroom', {
owner: {
type: DataTypes.BOOLEAN,
defaultValues: false,
},
});
return UserChatroom;
};
а затем в вашем преобразователе, когда вы создаете ChatRoom, обновите объединенную таблицу user_chatroom дополнительным столбцом owner со значением true, если пользователь является владельцем чата, или false, если это не
что-то вроде этого
id| owner | user_id|chatroom_id|
1 | false | 1 | 1 |
2 | true | 2 | 1 |
3 | false | 3 | 1 |
Большое спасибо, Джавед, что нашел время, чтобы ответить мне :) Однако я думаю, что, возможно, я не достаточно ясен. Моя проблема на самом деле не в поле владельца (тем не менее, спасибо, что поделились своим решением, это действительно может быть удобно). Моя проблема в том, чтобы написать всю мою мутацию createChatroom. Текущий код, который я написал, дает сбой (что меня не удивляет, поскольку я понятия не имею, что делаю ...). Создание комнаты работает, но вторая часть, где нужно назначить моего текущего пользователя текущему чату в таблице соединения, не работает. И это мой главный вопрос;)
Если ваша ассоциация верна, вам не нужно делать это вручную, не могли бы вы проверить, какие данные обновляются в таблице?
Я пробовал использовать ваш новый код. Я заметил, что вы создали новую модель UserChatroom. Сначала я подумал, что это модель чата .... Теперь, если я оставлю функцию .then (), она вылетит, говоря, что models.chatroom.addUser не является функцией. Если я удалю его, он попытается выполнить следующую операцию SQL: Выполнение (по умолчанию): INSERT INTO "chatrooms" ("id", "created_at", "updated_at") VALUES (DEFAULT, '2018-09-17 13:51 : 46.240 +00: 00 ',' 2018-09-17 13: 51: 46.240 +00: 00 ') ВОЗВРАЩЕНИЕ *;
Почему бы вам не перенести логику владельца в таблицу chatroom_user и не добавить новый столбец с владельцем в качестве логического?