如何使用续集使用外键值填充表?

问题描述 投票:1回答:2

我有模型:业务,贡献者,反馈。

我已经在反馈和贡献者之间以及反馈和商业之间建立了这样的关系:

Feedback.belongsTo(Business)

Feedback.belongsTo(Contributor)

相应的外键属性被添加到表Feedback中。问题是,如何用来自业务和贡献者表记录的ID填充它们?

此方法仅获得第一条记录。如果使用findAll(),则无法定义。

for (let assetsUrl of assetUrls) {
  ...
  var businesses = null;
  var reviews = null;
  ...
  var timestamp = Math.floor(Date.now() / 1000);
  var b_id = await Business.findOne({
    attributes: ["id"],
  })
  var c_id = await Contributor.findOne({
  })

    businesses = await Business.upsert({
      ...
      last_scraped: timestamp
    });
    reviews = await Review.upsert(
      {
        contributor_id: c_id.id,
        business_id: b_id.id,
        last_scraped: timestamp,
      },
    )
  }

业务模式:

class Business extends Model {}
Business.init(
  {
    id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    site: {
      type: Sequelize.STRING,
    },
    name: {
      type: Sequelize.STRING,
    },
    business_type: {
      type: Sequelize.STRING,
      unique: false,
      defaultValue: "",
    },
    address: {
      type: Sequelize.TEXT,
      // allowNull defaults to true
    },
    price: {
      type: Sequelize.STRING,
    },
    url: {
      type: Sequelize.STRING,
      allowNull: false, 
      unique: true,
    },
    last_scraped: {
      type: Sequelize.INTEGER, 
      defaultValue: Math.floor(Date.now() / 1000)
    },
  },
  {
    sequelize,
    modelName: "business",
    timestamps: true,
    createdAt: false,
    updatedAt: false,
    underscored: true
  }
);

Business === sequelize.models.Business;
Business.sync();

贡献者模型:

class Contributor extends Model {}
Contributor.init(
  {
    id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    site: {
      type: Sequelize.STRING,
    },
    name: {
      type: Sequelize.STRING,
      unique: false,
    },
    location: {
      type: Sequelize.STRING,
      unique: false,
    },
    photo: {
      type: Sequelize.STRING,
      unique: false,
    },
    url: {
      type: Sequelize.STRING,
      allowNull: false, 
      unique: true,
    },
    status: {
      type: Sequelize.SMALLINT,
    },
    last_scraped: {
      type: Sequelize.INTEGER, 
      defaultValue: Math.floor(Date.now() / 1000)
    },
  },
  {
    sequelize,
    modelName: "contributor",
    timestamps: true,
    createdAt: false,
    updatedAt: false,
    underscored: true,
  }
);

Contributor === sequelize.models.Contributor;
Contributor.sync();

反馈模型:

class Feedback extends Model {}
Feedback.init(
  {
    contributor_id: {
      type: Sequelize.INTEGER,
    },
    business_id: {
      type: Sequelize.INTEGER,
    },
    date: {
      type: Sequelize.STRING,
      unique: false,
    },
    rating: {
      type: Sequelize.STRING,
      unique: false,
    },
    content: {
      type: Sequelize.STRING,
      unique: false,
    },
    last_scraped: {
      type: Sequelize.INTEGER, 
      defaultValue: Math.floor(Date.now() / 1000)
    },
  },
  {
    sequelize,
    modelName: "feedback",
    timestamps: true,
    createdAt: false,
    updatedAt: false,
    underscored: true,
  }
);
Feedback.belongsTo(Contributor, { foreignKey: 'contributor_id' })
Feedback.belongsTo(Business, { foreignKey: 'business_id'})
Feedback=== sequelize.models.Review;
Feedback.sync();
mysql foreign-keys sequelize.js associations
2个回答
0
投票
findAll:

var feedback = await Feedback.findAll({ attributes: ['contributor_id', 'business_id', 'last_scraped'] })


0
投票
通过您的申请,将findOneoffset选项结合使用,您可以像这样创建/更新Feedback模型。

// Get number of records to avoid unnecessary findOne in the loop const bRecordCount = await Business.count(); const cRecordCount = await Contributor.count(); for (let i = 0; i < assetUrls.length; i++) { const assetsUrl = assetUrls[i]; // ... let bRecord = null; let cRecord = null; let options = { attributes: ["id"], // order by id to be sure we get different record each time order: [['id', 'ASC']], raw: true, offset: i //skip already taken records }; try { if (i < bRecordCount && i < cRecordCount) { bRecord = await Business.findOne(options) cRecord = await Contributor.findOne(options) } if (bRecord && cRecord) { feedback = await Feedback.upsert({ contributor_id: cRecord.id, business_id: bRecord.id, last_scraped: timestamp, //... }); } } catch (err) { console.log(err); } }

如果您有很多记录,则应考虑使用findAll()通过findAll()offset选项,然后做一个limitbulkCreate()选项可以避免进行很多数据库查询

© www.soinside.com 2019 - 2024. All rights reserved.