Sequelize: <table>не связан с <Table> - PullRequest
0 голосов
/ 17 июня 2020

Я получаю images is not associated to product! ошибку при привязке ассоциации модели.

ProductImages связано с Product, а ProductImages связано с Images моделью. Итак, мне нужно отрендерить свойство images в коллекцию products, назначив ему.

Модель, которую я пытаюсь привязать, приведена ниже.

products.model.ts

const Product = SQLize.define('product', {
    id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true }
    product_title: { type: new DataTypes.STRING(255) },
    vendor_id: { type: DataTypes.INTEGER }
}); 
Product.hasMany(ProductImages, {foreignKey: 'product_id', targetKey: 'id', as :'product_img_refs'})
export { Product };

product-images.model.ts

const ProductImages = SQLize.define('product_images', {
  id: { type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true, },
  product_id: { type: DataTypes.INTEGER },
  product_image_id: { type: DataTypes.INTEGER }
  img_type_id: { type: DataTypes.INTEGER }
});
ProductImages.belongsTo(ImagesModel, {foreignKey: 'product_image_id', targetKey: 'id', as:'product_images' })
export {ProductImages}

images.model.ts:

const ImagesModel = SQLize.define('images', {
  id: { type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true, },
  img_url: { type: DataTypes.STRING }
});
export { ImagesModel }

Ниже приведен файл репозитория, в котором я выполнил операцию SQLize.

public async getProductData() {
  var prodData = Product.findAll({
    include: [
      { model: Vendor, as: 'vendor' }, 
      { model: ProductImages, as: 'product_img_refs' }
      { model: ImagesModel, as: 'product_images' }
    ]
  });
  return prodData;
}

=> Пример product_images записей таблицы.

=> Пример изображений записей таблицы.

=> Схема БД для большей визуализации.

=> Я проверил этот ответ , но он не имеет отношения к моей модели, так как у меня есть три модели с разными ассоциациями.

1 Ответ

1 голос
/ 17 июня 2020

Вместо отношений hasMany и ownTo создайте отношение многие-ко-многим для продукта и изображений, а также отношения между изображениями и продуктом.

Вы можете расширить автоматически сгенерированную таблицу (столбцами ProductId и ImageId), передав имя модели.

const ProductImages = SQLize.define('ProductImages', {
  // ...
});
Product.belongsToMany(ImagesModel, { through: ProductImages });
ImagesModel.belongsToMany(Product, { through: ProductImages });

Теперь вы можете:

await Product.getImages();
await Images.getProducts();

Или используйте параметр include при запросе. Здесь есть примеры в документации . Это будет примерно так:

await Product.findAll({
  include: ImagesModel,
});
// It will be nested as such:
// { 
//   fields from product
//   Images: {
//     fields from image
//     ProductImages: {
//       fields from the 'through' table
//     }
//   }
// }
...