У меня проблема с продолжением при создании со связанной моделью с «уникальным» значением. Это работает, когда я создаю «книгу» с новой «категорией», но если «категория» уже существует, выдает ошибку, потому что она пыталась продублировать «уникальное» значение. Есть ли способ заставить 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
}
]
}
)
он выдает ошибку, говоря, что имя категории должно быть уникальным



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для всех, у кого возник такой же вопрос, это было мое окончательное решение:
В моем 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'] },
],
}
}
Зачем нужны две категории с одинаковым названием? Это противоречит цели категории, да? Кроме того, я думаю, вам нужно уже создать несколько кошек. И когда вы создаете книгу, вы указываете идентификатор категории, а не название.