【问题标题】:SequelizeEagerLoadingError: product is not associated to collectionSequelizeEagerLoadingError:产品未与集合关联
【发布时间】:2020-06-14 09:44:11
【问题描述】:

我在 Mysql 中使用 sequelize ORM。我有 3 个模型:Product、Collection、CollectionProduct

Product 和 Collection 之间的关系是多对多的,为了在 sequelize 中处理这个问题,我使用了 belongsToMany 关联。一切都很好,但是当我运行此代码以使用 include 获取包含其产品的集合时,会发生此错误:

SequelizeEagerLoadingError:产品未与集合关联!

产品型号:

module.exports = (sequelize, Sequelize) => {
const Product = sequelize.define('product', {
id: {
  allowNull: false,
  autoIncrement: true,
  primaryKey: true,
  type: Sequelize.INTEGER,
},
name_en: {
  type: Sequelize.STRING(255),
},
description_en: {
  type: Sequelize.STRING(1024),
},
price: {
  type: Sequelize.FLOAT,
  allowNull: false,
},
type: {
  type: Sequelize.STRING(255),
},
height: {
  type: Sequelize.INTEGER,
},
width: {
  type: Sequelize.INTEGER,
},
createdAt: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW,
  allowNull: false,
},
updatedAt: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW,
  allowNull: false,
},
}, {})

Product.associate = (models) => {
Product.belongsToMany(models.collection, { through: models.collectionProduct, as: 'collections', foreignKey: 'productId' })
}

return Product
}

收集模型:

module.exports = (sequelize, Sequelize) => {
const Collection = sequelize.define(
'collection', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    allowNull: false,
    autoIncrement: true,
  },
  name_en: {
    type: Sequelize.STRING(255),
  },
  itemsCount: {
    type: Sequelize.INTEGER,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
    allowNull: false,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
    allowNull: false,
  },
}, {},
)
Collection.associate = (models) => {
Collection.belongsToMany(models.product, { through: models.collectionProduct, as: 'products', foreignKey: 'collectionId' })
}
return Collection
}

系列产品型号:

module.exports = (sequelize, Sequelize) => {
const CollectionProduct = sequelize.define('collectionProduct', {
collectionId: {
  type: Sequelize.INTEGER,
},
productId: {
  type: Sequelize.INTEGER,
},
createdAt: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW,
  allowNull: false,
},
updatedAt: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW,
  allowNull: false,
},
}, {})

CollectionProduct.associate = (models) => {}


return CollectionProduct
}

routes/collection.js

const express = require('express')

const router = express.Router()

const Collection = require('../../controllers/collectionController')

router.get('/:id', async (req, res) => {
 const { id: collectionId } = req.params
 const collection = await Collection.getOne(collectionId)
 return collection
}

collectionController

const db = require('../models/index')

const Collection = db.collection
const Product = db.product

const getOne = async (collectionId) => {
   const collection = await Collection.findByPk(collectionId, {
      include: {
      model: Product,
      as: 'products',
      attributes: ['id', 'name_en'],
   },
  })
return collection
}

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    我发现了我的问题。在 collectionController 我使用的模型:产品 和 Product 应该是一个续集模型。但在我的代码中,这是一个在模型/索引中调用的函数。所以我改变了我的调用并将一个续集模型传递给 getOne

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2019-08-06
      • 2015-08-28
      • 2020-09-02
      • 2022-08-24
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多