我在使用具有“唯一”值的关联模型创建sequelize时遇到问题。它在我创建一个带有新“类别”的“书”时有效,但如果“类别”已经存在,则会抛出错误,因为它试图复制“唯一”值。有没有办法让sequelize.create尝试在相关模型上使用findAndCreate?
图书:
const Book = sequelize.define('book', {
title: Sequelize.STRING,
})
类别:
const Category = sequelize.define('category', {
id: Sequelize.BIGINT,
name: {
type: Sequelize.STRING,
unique: true,
},
})
和关系:
Book.belongsTo(Category, { foreignKey: 'category_id' })
所以,当我创作一本书时,我可以写:
Book.create(
{
title: 'Book',
category: {
name: 'Foo'
}
}, {
include: [
{
model: Category
}
]
}
)
如果之后我又创作了另一本书:
Book.create(
{
title: 'Another Book',
category: {
name: 'Foo'
}
}, {
include: [
{
model: Category
}
]
}
)
它会抛出错误,说category.name必须是唯一的
答案 0 :(得分:0)
对于有同样问题的人,这是我的最终解决方案:
在我的services.js上,我创建了一个函数create
,它接收request(req)
并且我的所有模型都已初始化。
create: (req, models) => {
const { category, ...rest } = req.body
if (category && category.name && !rest.category_id) {
return models.Category
.findOrCreate({
where: {
name: category.name
}
})
.then(([returnedCategory]) => {
return models.Book.create(
{
...rest,
category_id: returnedCategory.id
},
{ ...defaultOptions(models) }
)
})
} else {
return models.Book.create(rest, { ...defaultOptions(models) })
}
},
defaultOptions如下所示:
const defaultOptions = models => {
return {
attributes: {
exclude: ['category_id', 'created_at', 'updated_at'],
},
include: [
{ model: models.Category, attributes: ['id', 'name'] },
],
}
}