当前位置: 首页 > 知识库问答 >
问题:

在顺序迁移中创建关联

咸臻
2023-03-14

Nodejs。顺序4.41。尝试通过另一个表制作两个多对多关系的模型。例如,使用sequelize-cli运行...

sequelize model:generate --name Camera --attributes name:string,sn:string

这里有模特

// Camera model

'use strict';

module.exports = (sequelize, DataTypes) => {
  const Сamera = sequelize.define('Сamera', {
    name: DataTypes.STRING,
    sn: DataTypes.STRING
  }, {});
  Сamera.associate = function(models) {
    // associations can be defined here
      Camera.belongsToMany(models.Relay, {through: 'CameraRelay'});
  };
  return Сamera;
};

// Relay model

'use strict';

module.exports = (sequelize, DataTypes) => {
  const Relay = sequelize.define('Relay', {
    name: DataTypes.STRING,
    sn: DataTypes.STRING,
    channel: DataTypes.INTEGER
  }, {});
  Relay.associate = function(models) {
    // associations can be defined here
      Relay.belongsToMany(models.Camera, {through: 'CameraRelay'});
  };
  return Relay;
};

留档里有短语

属于多个关联用于连接具有多个目标的源。此外,目标也可以连接到多个源。

Project.belongs多(用户,{通过:'用户项目'});User.belongs多(项目,{通过:'用户项目'});

这将创建一个名为UserProject的新模型,该模型具有等效的外键Project ectId和userId。

迁移是

// create-relay

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Relays', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      sn: {
        type: Sequelize.STRING
      },
      channel: {
        type: Sequelize.INTEGER
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Relays');
  }
};

//create camera
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Сameras', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      sn: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Сameras');
  }
};

为什么在我运行迁移时,它不创建模型CameraRelay,也不为同一模型创建迁移?

共有1个答案

周浩博
2023-03-14

我猜误解是关于同步与迁移:你所指的大部分留档是使用同步方法从模型开始创建所有表和关联。

当您使用迁移时,您将使用迁移文件创建所有表/列/关联的数据库(在我看来,这是一种更好的方法,可以用于生产)。

要了解这种差异,只需查看您的相机型号与您的相机迁移文件:

  • 模型只有namesn属性定义
  • 迁移文件当然有namesn,但它也有idcreatedATupdatedAT

迁移文件的目的是以安全的方式更改您的数据库,允许您回滚到过去的任何时间点。

所以,回到你的问题,你必须:

  • 创建一个新的迁移文件以创建新的CameraRelay表,其中包含Camera和Relay表的外键
  • 使用与CameraRelay表的一对多关系更新当前的相机迁移文件
  • 使用与CameraRelay表的一对多关系更新当前的Relay迁移文件

CameraRelay迁移示例:

    'use strict';
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('CameraRelays', {
          cameraId: {
            primaryKey: true,
            type: Sequelize.INTEGER,
            allowNull: false,
            references: {        
              model: 'Relay',
              key: 'id'
            }
          },
          relayId: {
            primaryKey: true,
            type: Sequelize.INTEGER,
            allowNull: false,
            references: {         
              model: 'Camera',
              key: 'id'
            }
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
          }
        });
      },
      down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('CameraRelays');
      }
    };

 类似资料:
  • 当使用顺序迁移以及用户和角色之间的多对多关系时,我很纠结。 这是用户模型: 这是角色模型: 这是“创建用户”迁移: 这是“创建角色”迁移: 这是用户角色模型: 最后一个是“用户角色”迁移: 当我尝试从控制器访问时,就会出现问题: 当我使用< code > console . log(object . keys(user。_ _ proto _ _)我得到了这个没有创建特殊方法的数组,知道我哪里做错

  • 迁移Topic,是指把Topic从“开放平台账号”迁移到“生态云账号”体系下,这样才能够进行接下来的数据流配置操作; 接下来以在开放平台账号下(即目前的旧版流式消息队列页面)创建Topic然后进行迁移为例来讲解(如果已经有Topic,则直接操作迁移即可); 选择生态云机房 所选生态云机房需要和上一节 FDS Bucket所在机房相同。 创建Topic 如图所示,在“产品”下点击"流式消息队列",点

  • 问题内容: 有没有办法在Laravel 4迁移中生成存储的MYSQL过程? 例如,这是一个简单的过程生成查询,以字符串形式存储(通过Heredoc) 在迁移函数中运行此命令时,出现以下错误: 问题答案: 您的代码有两个主要问题 不是有效的sql语句。这只是一个MySql客户端命令。因此,请不要使用它。 顺便说一句 ,您得到的错误恰恰告诉您。 您无法使用来执行代码,因为它使用的预准备语句源代码。您可

  • 我正在从事一个项目,我正在使用laravel 5.8。这里我想创建一个外键。我试了很多次,但每次都收到一条关于迁移时间的错误消息。有三个表一个是行业,是小学和学生,这些是第二个表。我想在这两个辅助表trade_id上创建一个外键作为键的名称。 这是交易表(主表)。 这是学生表(辅助表)。 这是放置表(辅助表)。 在迁移时出现错误。

  • 创建迁移脚本 生成一个迁移脚本框架 让我们从创建一个新的 Phinx 迁移脚本开始。使用 create 命令: $ php vendor/bin/phinx create MyNewMigration 这将创建一个新的迁移脚本,格式是 YYYYMMDDHHMMSS_my_new_migration.php ,前14个字符是当前的timestamp,精确到秒。 如果你指定了多个脚本路径,将会提示你

  • Laravel版本:5.7 PHP版本: 7.2.9 数据库驱动程序 说明上次迁移创建表,但未在迁移表中注册 繁殖步骤我有14个迁移。如果我运行的表被创建,但没有注册为运行迁移我已经丢弃了家庭数据库几次 我的迁移状态表 最终,当我想刷新、回滚或迁移以进行开发时,我会收到这样一个错误,告诉我表存在,但不在迁移中 Illumb\Database\QueryException:SQLSTATE[42S0