Мой сценарий такой.Для данного товара на складе будет ноль или более затрат, связанных с ним.Итак, мои модели Sequelize выглядят следующим образом:
// StockItem Model
const StockItem = sequelize.define('StockItem', {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
purchasedDate: {
type: DataTypes.DATE,
allowNull: true,
defaultValue: null,
field: 'purchased_date',
}, {
// Other attributes
}, {
paranoid: false,
createdAt: 'created_date',
updatedAt: 'updated_date',
tableName: 'STOCK_ITEMS'
});
StockItem.associate = (models) => {
StockItem.hasMany(models.Cost, { as: 'StockItemCosts', foreignKey: 'stock_item_id' });
};
});
// Cost Model
const Cost = sequelize.define('Cost', {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
type: {
type: DataTypes.STRING(50),
allowNull: false,
}, {
// Other attributes
}, {
paranoid: false,
createdAt: 'created_date',
updatedAt: 'updated_date',
tableName: 'COSTS'
});
});
В соответствии с моими требованиями, я должен быть в состоянии сохранить Товар на складе, даже если он не требует затрат.Я пробовал разные способы сделать это.Но я получаю следующее сообщение об ошибке, когда я пытаюсь сохранить стоимость будет нулевое значение.Я использую Express API на основе Rest для сохранения моих данных в базу данных MySQL.И у меня есть сохраняемые данные об элементе запаса в БД следующим образом:
const stockItem = {
...restApiData // Data received from FE form submission.
StockItemCosts: restApiData.costDetails, // This is null when there is no costs associated with the item.
}
sequelize.transaction((t) => {
return StockItem.create(stockItem, {
transaction: t,
include: [ { model: Cost, as: 'StockItemCosts' }]
});
}).then ((result) => {
// console.log('result : ', result); // eslint-disable-line no-console
// Transaction has been committed
// result is whatever the result of the promise chain returned to the transaction callback
}).catch((err) => {
console.log('err : ', err); // eslint-disable-line no-console
// Transaction has been rolled back
// err is whatever rejected the promise chain returned to the transaction callback
});
И это ошибка, которую я получаю.
Executing (83cc74a4-7067-44ef-8767-d0c08783a132): ROLLBACK;
err : { SequelizeValidationError: notNull Violation: Cost.type cannot be null,
notNull Violation: Cost.cost cannot be null,
notNull Violation: Cost.createdBy cannot be null,
notNull Violation: Cost.updatedBy cannot be null
Я пробовал ограничения: ложь, как показано ниже, ноэто тоже не сработало.Любая помощь высоко ценится.
StockItem.hasMany (models.Cost, {as: 'StockItemCosts', foreignKey: 'stock_item_id', ограничений: false});
--------------------------------------------------------------- Обновить -------------------------------------------------------
Я нашел решение согласно комментарию @Praveen Kumar.Но когда я сохраняю объекты без затрат, я не могу получить те записи, которые не связаны с затратами.Поскольку я выбираю данные с нумерацией страниц, я не могу получить разные запросы, чтобы сделать это.
Вот как я сейчас поступаю:
return StockItem.findAll({ include: [ { model: Cost, as: 'StockItemCosts' }] })