首先,让我解释一下我想做什么。我有两个定义良好的模型User
和Product
。当定义与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对象的数组。当仅是一种产品时,它可以正常工作,但是当有多种产品时,它会失败。因此,我想知道是否可以使用任何方法从同一用户批量创建这些产品。我可能做错了方法。因此,如果有更好的方法,那么我将不胜感激。谢谢您的帮助。
关联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)
与用户建立关联。