Некорректная ассоциация - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу построить такое отношение: erd

Я хочу, чтобы каждый пользователь содержал список сообщений, а каждое сообщение содержало информацию об отправителе.Относится к ERD, который я опубликовал.

Код, который у меня есть для миграций:

    module.exports = {
      up: (queryInterface, Sequelize) =>
        queryInterface.createTable('Messages', {
          id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER,
          },
          text: {
            type: Sequelize.STRING,
            allowNull: false,
          },
          toUserId: {
            type: Sequelize.INTEGER,
            // TODO changed from CASCADE - not sure about change
            onDelete: 'CASCADE',
            references: {
              model: 'Users',
              key: 'id',
              as: 'toUserId',
            },
          },
          fromUserId: {
            type: Sequelize.INTEGER,
            // TODO changed from CASCADE - not sure about change
            onDelete: 'CASCADE',
            references: {
              model: 'Users',
              key: 'id',
              as: 'fromUserId',
            },
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
        }),
      down: (queryInterface /* , Sequelize */) =>
        queryInterface.dropTable('Messages'),
    };

module.exports = {
  up: (queryInterface, Sequelize) =>
    queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      firstName: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      lastName: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      lat: {
        allowNull: true,
        type: Sequelize.INTEGER,
      },
      lng: {
        allowNull: true,
        type: Sequelize.INTEGER,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATEONLY,
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATEONLY,
      },
    }),
  down: (queryInterface /* , Sequelize */) => queryInterface.dropTable('Users'),
};

И для моделей:

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER,
    },
    firstName: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    lastName: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    lat: {
      allowNull: true,
      type: DataTypes.INTEGER,
    },
    lng: {
      allowNull: true,
      type: DataTypes.INTEGER,
    },
    createdAt: {
      allowNull: false,
      type: DataTypes.DATEONLY,
    },
    updatedAt: {
      allowNull: false,
      type: DataTypes.DATEONLY,
    },
  });

  User.associate = (models) => {
    User.hasMany(models.Message, {
      foreignKey: 'toUserId',
      as: 'messages',
    });
  };

  return User;
};
module.exports = (sequelize, DataTypes) => {
  const Message = sequelize.define('Message', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER,
    },
    text: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    createdAt: {
      allowNull: false,
      type: DataTypes.DATE,
    },
    updatedAt: {
      allowNull: false,
      type: DataTypes.DATE,
    },
  });

  Message.associate = (models) => {
    Message.belongsTo(models.User, {
      foreignKey: 'toUserId',
    });
  };
  return Message;
};

Однако, когда я пытаюсь добавить новое сообщениеfromUserId отображается как нулевое значение.Когда я пытаюсь получить сообщения, это выглядит так:

[
    {
        "id": 1,
        "text": "mytext",
        "createdAt": "2018-11-29T20:12:22.253Z",
        "updatedAt": "2018-11-29T20:12:22.253Z",
        "toUserId": 2,
        "User": {
            "id": 2,
            "firstName": "name1",
            "lastName": "name2",
            "lat": null,
            "lng": null,
            "createdAt": "2018-11-29",
            "updatedAt": "2018-11-29"
        }
    }
]

1 Ответ

0 голосов
/ 30 ноября 2018

В соответствии с вашим ERD Я думаю, что ваш relationships должен выглядеть примерно так.

У пользователя много сообщений

Сообщение принадлежитuser В этом случае ваша миграция Message должна выглядеть примерно так.

id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER,
          },
          text: {
            type: Sequelize.STRING,
            allowNull: false,
          },
          fromUserId: {
            type: Sequelize.INTEGER,
            // TODO changed from CASCADE - not sure about change
            onDelete: 'CASCADE',
            references: {
              model: 'Users',
              key: 'id',
            },
          },

Обратите внимание, что я удалил столбец toUserId и этот псевдоним as: 'fromUserId', тоже.

Вваша User миграция, это правильно вам не нужно ничего там менять.

В вашей Message модели

  Message.belongsTo(models.User, {
      foreignKey: 'fromUserId',
    });
  };

Обратите внимание, что у вас естьтолько один FK и fromUserId

в вашей User модели.

User.associate = (models) => {
    User.hasMany(models.Message, {
      foreignKey: 'fromUserId',
    });
  };

После всего этого вы сможете получать сообщения, принадлежащие user_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...