web-dev-qa-db-ja.com

続編:関連付けのシード

たとえば、コースとビデオの2つのモデルがあります。そして、コースには多くのビデオがあります。

// course.js
'use strict';

module.exports = (sequelize, DataTypes) => {
  const Course = sequelize.define('Course', {
    title: DataTypes.STRING,
    description: DataTypes.STRING
  });

  Course.associate = models => {
    Course.hasMany(models.Video);
  };

  return Course;
};


// video.js
'use strict';

module.exports = (sequelize, DataTypes) => {
  const Video = sequelize.define('Video', {
    title: DataTypes.STRING,
    description: DataTypes.STRING,
    videoId: DataTypes.STRING
  });

  Video.associate = models => {
    Video.belongsTo(models.Course, {
      onDelete: "CASCADE",
      foreignKey: {
        allowNull: false
      }
    })
  };

  return Video;
};

ビデオを含むコースでシードを作成します。どうすればできますか?ビデオが含まれているシードを作成する方法がわかりません。

8
zett

アソシエーションを必要とするモデルインスタンスを挿入するために、SequelizeのqueryInterfaceを使用して生のSQLにドロップダウンできます。あなたの場合、最も簡単な方法は、コースとビデオのシーダーを1つ作成することです。 (注:主キーと外部キーをどのように定義しているかわからないため、videosテーブルにフィールドcourse_idがあると仮定しています。)

module.exports = {
  up: async (queryInterface) => {
    await queryInterface.bulkInsert('courses', [
      {title: 'Course 1', description: 'description 1', id: 1}
      {title: 'Course 2', description: 'description 2', id: 2}
    ], {});

    const courses = await queryInterface.sequelize.query(
      `SELECT id from COURSES;`
    );

    const courseRows = courses[0];

    return await queryInterface.bulkInsert('videos', [
      {title: 'Movie 1', description: '...', id: '1', course_id: courseRows[0].id}
      {title: 'Movie 2', description: '...', id: '2', course_id: courseRows[0].id},
      {title: 'Movie 3', description: '...', id: '3', course_id: courseRows[0].id},
    ], {});
  },

  down: async (queryInterface) => {
    await queryInterface.bulkDelete('videos', null, {});
    await queryInterface.bulkDelete('courses', null, {});
  }
};
17
mcranston18