Как написать ассоциацию «принадлежит», которая может быть из разных таблиц? - PullRequest
0 голосов
/ 15 мая 2019

Как мне написать ассоциацию для модели A, которая принадлежит либо к модели B, либо к модели C, но не к обеим?

Допустим, у меня есть модель сотрудника, модель подрядчика и модель события.Связано следующим образом: у сотрудника много событий.
у подрядчика много событий.
событие принадлежит либо подрядчику, либо сотруднику.

Создать ли объединенную таблицу employee_contractor и сказать, что событие принадлежит employee_contractor?

Это, вероятно, довольно тривиально, но я очень новичок в программировании Sequelize / DB. Мне трудно понять, когда ичто использовать.Я знаю, что, возможно, есть ответы на подобные вопросы, но я не знаю, как правильно сформулировать мой вопрос, чтобы найти их.

// Employee model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Employee = sequelize.define('Employee', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    // other fields
    //...

  }, {});
  Employee.associate = function(models) {
    // associations can be defined here
  };
  return Employee;
};
// Contractor model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Contractor = sequelize.define('Contractor', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    company: DataTypes.STRING,
    // other fields
    //...

  }, {});
  Contractor.associate = function(models) {
    // associations can be defined here
  };
  return Contractor;
};
// Event Model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Event = sequelize.define('Event', {
    reason: DataTypes.STRING,
    escort: DataTypes.STRING,
    // other fields
    //...

  }, {});
  Event.associate = function(models) {
    // associations can be defined here
  };
  return Event;
};

1 Ответ

0 голосов
/ 16 мая 2019

В этом случае я бы порекомендовал разбить событие на два отдельных события: employeeEvents и ContractorEvents (чтобы упростить использование ассоциативных связей при последующих действиях запроса) и использовать простой belongsTo для каждого типасобытие и hasMany на актеров.

Employee

// Employee model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Employee = sequelize.define('Employee', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    // other fields
    //...

  }, {});
  Employee.associate = function(models) {
    // associations can be defined here
    Employee.hasMany(models.EmployeeEvent);
  };
  return Employee;
};

EmployeeEvents

// EmployeeEvent Model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const EmployeeEvent = sequelize.define('Event', {
    reason: DataTypes.STRING,
    escort: DataTypes.STRING,
    // other fields
    //...

  }, {});
  EmployeeEvent.associate = function(models) {
    // associations can be defined here
    EmployeeEvent.belongsTo(models.Employee);
  };
  return EmployeeEvent;
};

Contractor

// Contractor model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Contractor = sequelize.define('Contractor', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    company: DataTypes.STRING,
    // other fields
    //...

  }, {});
  Contractor.associate = function(models) {
    // associations can be defined here
    Contractor.hasMany(models.ContractorEvent);
  };
  return Contractor;
};

ContractorEvents

// ContractorEvent Model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const ContractorEvent = sequelize.define('Event', {
    reason: DataTypes.STRING,
    escort: DataTypes.STRING,
    // other fields
    //...

  }, {});
  ContractorEvent.associate = function(models) {
    // associations can be defined here
    ContractorEvent.belongsTo(models.Employee);
  };
  return ContractorEvent;
};
...