Sequelize create包含现有对象

时间:2018-03-25 22:18:52

标签: javascript include sequelize.js

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

1 个答案:

答案 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'] },
    ],
  }
}