Sequelize hasMany()关联中的批量插入

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

首先,让我解释一下我想做什么。我有两个定义良好的模型UserProduct。当定义与hasMany()belongsTo()的关联时,我使用由sequelize创建的方法来创建我的产品。

user.hasMany(Product) Product.belongsTo(User)

并且我使用此方法从product创建user

User.findOne({where:{id:SomeID}}).then((userObj)=>{
 userObj.createProduct(productobj).then((userObj)=>{

             //product  creation handling

 }).catch((errorProduct)=>{

             //product  creation error handling
 });

       }).catch((error)=>{

         //user creation error handling
});

My productobj是属于User的json对象的数组。当仅是一种产品时,它可以正常工作,但是当有多种产品时,它会失败。因此,我想知道是否可以使用任何方法从同一用户批量创建这些产品。我可能做错了方法。因此,如果有更好的方法,那么我将不胜感激。谢谢您的帮助。

node.js model sequelize.js associations
1个回答
0
投票

关联user.hasMany(Product)将在User模型中添加以下方法。

/**
 * The addAssociations mixin applied to models with hasMany.
 * An example of usage is as follows:
 *
 * ```js
 *
 * User.hasMany(Role);
 *
 * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes {
 *  // getRoles...
 *  // setRoles...
 *  addRoles: Sequelize.HasManyAddAssociationsMixin<RoleInstance, RoleId>;
 *  // addRole...
 *  // createRole...
 *  // removeRole...
 *  // removeRoles...
 *  // hasRole...
 *  // hasRoles...
 *  // countRoles...
 * }
 * ```
 *
 * @see https://sequelize.org/master/class/lib/associations/has-many.js~HasMany.html
 * @see Instance
 */

对于您的情况,应使用userModel.addProducts(productModels)。例如:

import { sequelize } from '../../db';
import { Model, DataTypes, HasManyAddAssociationsMixin } from 'sequelize';

class User extends Model {
  public addProducts!: HasManyAddAssociationsMixin<Product, number>;
}
User.init(
  {
    email: {
      type: DataTypes.STRING,
      unique: true,
    },
  },
  { sequelize, modelName: 'users' },
);

class Product extends Model {}
Product.init(
  {
    name: DataTypes.STRING,
  },
  { sequelize, modelName: 'products' },
);

User.hasMany(Product);
Product.belongsTo(User);

(async function test() {
  try {
    await sequelize.sync({ force: true });
    // seed
    await User.create(
      {
        email: '[email protected]',
        products: [{ name: 'apple' }, { name: 'amd' }],
      },
      { include: [Product] },
    );
    // add another two products for this user
    const SomeID = 1;
    const productobj = [{ name: 'nvidia' }, { name: 'intel' }];
    const productModels = await Product.bulkCreate(productobj);
    const userObj = await User.findOne({ where: { id: SomeID } });
    await userObj.addProducts(productModels);
  } catch (error) {
    console.log(error);
  } finally {
    await sequelize.close();
  }
})();

数据库中的数据行:

=# select * from users;
 id |       email
----+-------------------
  1 | [email protected]
(1 row)

node-sequelize-examples=# select * from products;
 id |  name  | userId
----+--------+--------
  1 | apple  |      1
  2 | amd    |      1
  3 | nvidia |      1
  4 | intel  |      1
(4 rows)

注意:这些方法仅接受目标模型作为其参数,注意是纯JavaScript对象或对象数组。您需要bulkCreate产品,然后使用userModel.addProducts(productModels)与用户建立关联。

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