node.js - 使用带有 1 :M associations 的 Sequelize

标签 node.js sequelize.js

我正在开发一个使用 MySQL 和 Node 作为后端的简单 API,并使用 Sequelize 来处理数据库操作。用户必须能够根据模板生成时间间隔,该模板将指定开始时间、结束时间和每个时间间隔的持续时间(以分钟为单位)。为此,我创建了 2 个表:模板 模板_小时 它们具有 1:M 的关系。图形化:

Sample data

我想尽可能避免原始 SQL 查询,并且我想知道是否有一种方法可以使用 Sequelize 方法创建模板及其时间间隔。创建模板真的很容易,但我不知道如何一次创建和分配它的间隔。这是我到目前为止的代码:

const Template = db.Template;

db.sequelize.transaction()
  .then((transaction) => {
    Template.create({ 
      name: req.body.name,
      hour_start: req.body.hour_start,
      hour_end: req.body.hour_end,
      interval_duration: req.body.interval_duration
    }, { transaction })
    .then((template) => {
      // The template has been created

      // This method generates an array with all the time intervals. F.i. [ '08:00', '08:30', '09:30', etc... ]
      var templateHours = generateTemplateHours(req.body.hour_start, req.body.hour_end, req.interval_duration);

      // <<<<<<< ??????
      // How could I create the time intervals and assign them to the newly created template??
      // <<<<<<< ??????

      // If everyting goes fine, do a transaction.commit()
    }).catch((error) => {
      // Error creating the template
      transaction.rollback();

      res.status(500).json(new ApiResponse(false, 'Something went wrong', error));
    });
  });

提前致谢,

最佳答案

假设 TemplateHours 被定义为一个模型,并且 Template 模型与别名 TemplateHours 有一个“hasMany”关联。您可以使用将在模板原型(prototype)上定义的“createTemplateHours”函数。

这将创建一个 TemplateHours 实例并将其关联到 Template 实例。由于您没有提供有关模型 TemplateHours 具有哪些属性的信息,我只是假设该属性称为“hour_property”

const Template = db.Template;
const TemplateHours = db.TemplateHours;

db.sequelize.transaction()
.then(function(transaction)
{
    return Template.create({
      name: req.body.name,
      hour_start: req.body.hour_start,
      hour_end: req.body.hour_end,
      interval_duration: req.body.interval_duration
    }, {
        transaction: transaction
    })
    .then(function(template)
    {
        var templateHours = generateTemplateHours(req.body.hour_start, req.body.hour_end, req.interval_duration);
        return Promise.all(templateHours.map(function(templateHour)
        {
            return template.createTemplateHours({
                hour_property: templateHour
            }, {transaction: transaction});
        }));
    })
    .then(function()
    {
        transaction.commit();
        // res.status etc.
    })
    .catch(function(error)
    {
        transaction.rollback();
        // res.status etc.
    });
});

关于node.js - 使用带有 1 :M associations 的 Sequelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57609269/

相关文章:

node.js - Heroku 应用程序的环境管理 Node.js 插件/方法?

javascript - Sequelize .set 错误,.set 不是函数

javascript - Node.js Express 和 Parse.com

validation - Sequelizejs : Validation returning __raw in error

node.js - 如果没有传递查询字符串,Sequelize如何获取所有数据

node.js - 在 Electron 应用程序中以 root 身份运行 Node 命令

javascript - Express 中间件中的异步等待不起作用

javascript - 如何使用 sequelize 检查记录是否更新

node.js - 在哪里定义 Sequelize 关联

javascript - 迁移到 V5 后序列化记录问号而不是值