Sequelize: как связать несколько моделей для запроса соединения и создать настраиваемые столбцы - PullRequest
0 голосов
/ 16 июня 2020

Я хотел бы применить соединение и groupBy в Sequelize v5, которое будет извлекать записи из пяти моделей таблиц и возвращать записи в следующем формате.

{
  "data": [
    {
      "products": {
        "id": "01",
        "name": "lorium",
        "description": "ipsum",
        "product_images": [
          {
            "url": "", // From images tbl
            "image_type": "Front" // From imge_types tbl
          },
          {
            "url": "",
            "image_type": "Back"
          }
        ]
      },
      "vendor": {
        "first_name": "john",
        "last_name": "doe"
      }
    }
  ]
}

Я создал все пять моделей отдельно и назначил им ассоциацию.

Модель продукта ::

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

export { Product };

Модель поставщика ::

const Vendor = SQLize.define('vendor', {
  id: { type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true, },
  first_name: { type: DataTypes.STRING(100) },
  last_name: { type: DataTypes.STRING(100) }
});
Product.belongsTo(Vendor, {foreignKey: 'id'})
Vendor.hasOne(Product, {foreignKey: 'id'})

export { Vendor }

Модель изображений продукта ::

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 }
});

export {ProductImages}

Модель изображений ::

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

Типы изображений Модель ::

const ImageTypes = SQLize.define('image_types', {
  id: { type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true, },
  image_type: { type: DataTypes.STRING }
});
export { ImageTypes }

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

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

Я не получаю правильный способ привязать все модели, которые вернут мне результат, как описано в приведенном выше формате json.

Ответы [ 2 ]

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

Чтобы получить вложенный вывод, как показано в вопросе, вам необходимо создать связи между следующими:

  • ProductImages и ImagesModel
  • ProductImages и ImageTypes

После этого вы можете вложить модели в параметры findAll, как показано ниже:

// Create associations (depends on your data, may be different)
ProductImages.hasOne(ImagesModel);
ProductImages.hasOne(ImageTypes);

// Return product data with nested models
let prodData = Product.findAll({
    include: [
        { model: Vendor, as: 'vendor' },
        {
            model: ProductImages, as: 'product_img_refs',
            include: [
                { model: ImagesModel }, // Join ImagesModel onto ProductImages (add aliases as needed)
                { model: ImageTypes } // Join ImageTypes onto ProductImages (add aliases as needed)
            ]
        }
    ]
});
0 голосов
/ 17 июня 2020

Я нашел проблему. вы пытались включить модель ProductImages в Vendor. Согласно вашей ассоциации, ProductImages ассоциируется с Product, а не с Vendor.

Пожалуйста, попробуйте это

let prodData = Product.findAll({
    include: [
        { model: Vendor, as: 'vendor' },
        { model: ProductImages }
    ]
});

...