簡體   English   中英

查詢時如何使用順序遷移模型?

[英]How to use sequelize migration models when querying?

我最近已從“正常”續集轉為使用sequelize-cli進行遷移。 到目前為止,使用cli效果很好。 但是我不確定如何使用生成的模型。 尤其是我看來,我對協會有疑問。 它們是在數據庫中正確創建的,但是在代碼中我收到類似Upvote is not associated to Video錯誤, Upvote is not associated to Video

我已經使用cli創建了模型,並嘗試導入和使用它們。

這是cli生成的video模型的一個片段:

module.exports = (sequelize, DataTypes) => {
    const Video = sequelize.define('Video', {
        userid: DataTypes.STRING,
        ...
    }, {});
    Video.associate = function(models) {
        Video.hasMany(models.Upvote, { foreignKey: 'videoid', sourceKey: 'id' });
    };
    return Video;
};

以下是遷移的摘要:

let videos = function (queryInterface, Sequelize) {
    return queryInterface.createTable('Videos', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
        },
        userid: {
            type: Sequelize.STRING,
            references: {
                model: 'Users',
                key: 'id'
            },
         },
         ...
     });
};

這是我導入模型的方式:

const Video = require('../models/video')(dbConnector.sequelize, Sequelize.DataTypes);

我覺得我需要傳遞sequelizeDataTypes sequelize ,因為當我自己構建模型時這不是必需的。 這是導入它們的正確方法嗎? 導入它們時沒有錯誤,並且可以像Videos.findAll()一樣查詢它們,但是關聯不起作用。 而且我不確定如何使它們工作,我是否需要自己調用Video.associate(models)函數? 這看起來也很奇怪。

我使用這些模型的方式一定做錯了,請讓我知道該怎么做。

Sequelize cli將在models目錄中生成一個index.js ,其中將包含以下代碼,

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === 
      '.js');
  })
  .forEach(file => {
    const model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

在第一組代碼中,它將導入所有模型,而在第二組代碼中,它將基於每個模型的associate方法中配置的associate所有模型。

例如,在您的情況下, VideoUpvote之間的關聯可以定義為:

車型/的Video.js

module.exports = (sequelize, DataTypes) => {
    const Video = sequelize.define('Video', {
        id: DataTypes.STRING,
        ...
    }, {});
    Video.associate = function(models) {
        Video.hasMany(models.Upvote, {
            foreignKey: 'videoId',
            sourceKey: 'id'
        });
    };
    return Video;
};

車型/ Upvote.js

module.exports = (sequelize, DataTypes) => {
    const Upvote = sequelize.define('Upvote', {
        id: DataTypes.STRING,
        videoId: DataTypes.STRING
        ...
    }, {});
    Upvote.associate = function(models) {
        Upvote.belongsTo(models.Video, {
            foreignKey: 'videoId',
            targetKey: 'id'
        });
    };
    return Upvote;
};

希望這可以幫助!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM