gpt4 book ai didi

javascript - Sequelize 创建包含现有对象

转载 作者:行者123 更新时间:2023-12-03 22:27:52 25 4
gpt4 key购买 nike

我在创建具有“唯一”值的关联模型时遇到 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 必须是唯一的

最佳答案

对于任何有同样问题的人,这是我的最终解决方案:

在我的 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'] },
],
}
}

关于javascript - Sequelize 创建包含现有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49481574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com