Выполнение ассоциаций на объединяющем столе в Node.js Sequelize - PullRequest
0 голосов
/ 21 сентября 2018

Использование Node.js Sequelize на Postgres DB.У меня есть следующие три таблицы: Группы , Приложения и объединяющая таблица для сопоставления этой взаимосвязи GroupApplication .GroupApplication использует идентификаторы в качестве внешних ключей.Когда я делаю поиск всех в таблице GroupApplication в sequelize, я бы хотел, чтобы поле «имя» для соответствующих групп и приложений было присоединено к соответствующим таблицам.Таким образом, я хотел бы присоединиться к

Groups                            Applications    

| id| name     | description |       | id| name   | description |
| --|:--------:| -----------:|       | --|:------:| -----------:|
| 1 | admin    | First Group |       | 1 | typer  | Types       |
| 2 | primary  | Second Group|       | 2 | tester | Tests       |
| 3 | secondary| Third Group |       | 3 | zestrer| Zests       |


GroupApplications
| id| groups_id | application_id |
| --|:---------:| --------------:|
| 1 | 1         | 1              | 
| 2 | 1         | 2              |
| 3 | 1         | 3              |
| 4 | 2         | 2              |
| 5 | 2         | 3              |
| 6 | 3         | 2              |

The resulting join:

GroupApplications
| id|groups_id|group_name|application_id|application_name|
| --|:-------:|:--------:|:------------:|---------------:|
| 1 | 1       | admin    |1             |typer           |    
| 2 | 1       | admin    |2             |tester          |
| 3 | 1       | admin    |3             |zester          |
| 4 | 2       | primary  |2             |tester          |
| 5 | 2       | primary  |3             |zester          |
| 6 | 3       | secondary|2             |tester          |

У меня есть следующие файлы:

groups.js       

module.exports = function (sequelize, DataTypes) {
  var Groups = sequelize.define('Groups', {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true
    },
      name: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true
    }
  }, {
    timestamps: false,
    tableName: 'groups',
  });

  Groups.associate = function(models) {
    Groups.belongsToMany(models.GroupApplication, { through: 'group_application', foreignKey: 'group_id' });
  };

return Groups;
};


applications.js       

module.exports = function (sequelize, DataTypes) {
  var Applications = sequelize.define('Applications', {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true
    },
      name: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true
    }
  }, {
    timestamps: false,
    tableName: 'groups',
  });

  Applications.associate = function(models) {
    Applications.belongsToMany(models.GroupApplication, { through: 'group_application', foreignKey: 'application_id' });
  };

return Applications;
};

group-application.js

module.exports = function (sequelize, DataTypes) {
  let GroupApplication = sequelize.define('GroupApplication', {
    group_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true
    },
    application_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true
    }
  }, {
    timestamps: false,
    tableName: 'group_application',
  });

  return GroupApplication;
};

1 Ответ

0 голосов
/ 21 сентября 2018

Вам не нужно определять GroupApplication, оно будет выведено, как и foreignKey.Соотношение должно быть между Group и Application (единственное число лучше, думайте о нем как об объектной модели, где у вас есть Instance из Application Model), но происходит through соединение group_applicationТаблица.После этого вы можете include каждый из Models включить в запрос другого.

Обратите внимание, что я не проверял этот код.

group.js

module.exports = function (sequelize, DataTypes) {
  var Group = sequelize.define('Group', 
    {
      name: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true
      },
    },
    {
      tableName: 'group',
      timestamps: false,
      underscored: true,
    }
  );

  Group.associate = function(models) {
    Group.belongsToMany(models.Application, {
      as: 'applications',           // <-- alias here
      through: 'group_application',
    });
  };

  return Group;
};

application.js

module.exports = function (sequelize, DataTypes) {
  var Application = sequelize.define('Application',
    {
      name: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true
      },
    },
    {
      tableName: 'application',
      timestamps: false,
      underscored: true,
    }
  );

  Application.associate = function(models) {
    Application.belongsToMany(models.Group, {
      as: 'groups',           // <-- alias here
      through: 'group_application',
    });
  };

  return Application;
};

example.js

// return all Groups and their Applications
const groupsToApplications = await Group.findAll({
  include: [
    {
      model: Application,
      as: 'applications',
      through: 'group_application',
    },
  ],
});

// return all Applications and their Groups
const applicationsToGroups = await Application.findAll({
  include: [
    {
      model: Group,
      as: 'groups',
      through: 'group_application',
    },
  ],
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...