续集中的批量插入具有许多()关联



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

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

我使用此方法从user创建product.

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
});

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

关联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: 'example@gmail.com',
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 | example@gmail.com
(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)将这些产品与此用户相关联

似乎目前还不支持此功能(尽管自 2015 年以来一直要求(。我们有几个解决方法:

  1. 如果您的模型定义允许,您可以按照 slideshowp2 的答案进行操作:批量创建产品,然后将其分配给用户。如果您允许在customerId列上使用空值,这将不起作用(这可能不是一个好主意(。

  2. 如果您知道 userId,则可以在要创建的每个产品项中包含此 ID,然后使用 Products.bulkCreate((。这将起作用。

  3. 针对用户单独创建每个产品。有多种方法可以做到这一点,例如

    Promise.all( productArray.map((prod( => { return user.createProduct(prod( }))

最新更新