Создать экземпляр в продолжении отношения принадлежит многим

У меня проблемы с пониманием документации сиквелиза, касающейся отношений "принадлежит многим". Мне удалось правильно настроить его в самой БД, но теперь, когда я хочу выполнить базовую операцию 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 и не добавить новый столбец с владельцем в качестве логического?

Javed 17.09.2018 12:09

"владелец" отсутствует в таблице chatroom_user. В нем только ID пользователя и ID чата. Владелец - столбец, содержащий идентификаторы пользователей в таблице "чат".

SKMTH 17.09.2018 13:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
473
1

Ответы 1

Я могу предложить вам следующее: удалить владельца из чата и переместить владельца в таблицу соединений, в вашем случае - в таблицу 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. Текущий код, который я написал, дает сбой (что меня не удивляет, поскольку я понятия не имею, что делаю ...). Создание комнаты работает, но вторая часть, где нужно назначить моего текущего пользователя текущему чату в таблице соединения, не работает. И это мой главный вопрос;)

SKMTH 17.09.2018 15:07

Если ваша ассоциация верна, вам не нужно делать это вручную, не могли бы вы проверить, какие данные обновляются в таблице?

Javed 17.09.2018 15:13

Я пробовал использовать ваш новый код. Я заметил, что вы создали новую модель 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 ') ВОЗВРАЩЕНИЕ *;

SKMTH 17.09.2018 15:56

Другие вопросы по теме