Как автоматически заполнить третью таблицу «Многие ко многим» через таблицу в последовательности

#node.js #postgresql #sequelize.js #relational-database #associations

Вопрос:

Я новичок в секвенировании, у меня есть база данных Postgres

У меня есть две таблицы, которые должны быть связаны друг с другом как отношение «Многие ко многим», основанное на сквозной таблице.

Первые две таблицы:

  1. покупатель
  2. магазин товаров

И третья таблица, которая находится между ними, — это список заказов:

И вот как я установил их связь с таблицей order_list:

   Customer.associate = models => {
    Customer.belongsToMany(models.StoreProduct, { 
      through: models.OrderList,
      unique: false,
      foreignKey: 'customers_cid',
    });
  }
 
// and for the StoreProduct I have it like this

  StoreProduct.associate = models => {
    StoreProduct.belongsToMany(models.Customer, { 
      through: models.OrderList,
      unique: false,
      foreignKey: 'store_products_spid',
    });
  }
 

Затем, что касается таблицы списка заказов, я хотел включить два дополнительных столбца «количество» и «цена».

Количество в основном будет зависеть от выбора клиентом нескольких товаров store_product. Затем я хотел, чтобы в столбце «Цена» было записано количество товаров, выбранных клиентом, как количество * цена стоимости продукта. У меня есть столбец цен в store_products table as, поэтому я хотел quantity , чтобы запись была записана на order_list table * price в store_products table основном. Не могу понять, как это сделать внутри order_list table price колонки.

вот мое определение order_list table

 module.exports = (sequelize, DataTypes) => {
  const OrderList = sequelize.define('OrderList', {
    quantity: {
      type: DataTypes.INTEGER
    },
    price: { // Here I wanted SUM(quantity * StoreProductID.price) How do I do it?
      type: DataTypes.DECIMAL(10, 2)
    }
  }, {
    tableName: 'order_list',
    timestamps: true,
    createdAt: 'created_at',
    updatedAt: 'updated_at',
    // paranoid: true
  });

  return OrderList;
}
 

Вот остальная часть определенных двух таблиц StoreProduct

   const StoreProduct = sequelize.define('StoreProduct', {
    spid: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      allowNull: false,
      primaryKey: true
    },
    product_name: {
      type: DataTypes.STRING(100),
      allowNull: false,
      unique: true,
      // validate: {
      //   len: [1, 100]
      // }
    },
    type: {
      type: DataTypes.STRING(25),
      allowNull: true,
    //   validate: {
    //     len: [1, 100]
    //   }
    },
    description: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    price: {
      type: DataTypes.DECIMAL(10, 2),
      allowNull: false
    },
    quantity: {
      type: DataTypes.INTEGER,
      allowNull: false
    }
  }, {
    tableName: 'store_products',
    timestamps: true,
    createdAt: 'created_at',
    updatedAt: 'updated_at',
    // freezeTableName: true
    // paranoid: true
  })
 

Customer Table

   const Customer = sequelize.define('Customer', {
    cid: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      allowNull: false,
      primaryKey: true
    },
    first_name: {
      type: DataTypes.STRING(25),
    },
    last_name: {
      type: DataTypes.STRING(25),
    },
    address: {
      type: DataTypes.STRING(100),
      allowNull: false
    }, 
    zip_code: {
      type: DataTypes.STRING(25),
      allowNull: false      
    },
    city: {
      type: DataTypes.STRING(50),
      allowNull: false
    },
    country: {
      type: DataTypes.STRING(50),
      allowNull: false
    },
    email: {
      type: DataTypes.STRING(50),
      allowNull: false
    }
  }, {
    tableName: 'customers',
    timestamps: true,
    createdAt: 'created_at',
    updatedAt: 'updated_at',
    // paranoid: true
  })
 

So I wanted the price column from the order_list table to monitor this SQL query basically but done in the world of Sequelize which I am new too:

 SELECT SUM(StoreProduct.price * OrderList.quantity) 
FROM store_products AS StoreProduct
JOIN order_list AS OrderList
ON OrderList.store_products_spid = StoreProduct.spid;
 

// or maybe remove SUM idk but non the less

I want

StoreProduct.price * OrderList.quantity

Done inside the define in the price column of order_list table

   const OrderList = sequelize.define('OrderList', {
    quantity: {
      type: DataTypes.INTEGER
    },
    price: { // DONE HERE StoreProduct.price * OrderList.quantity with StoreProduct the FKEY as demonstrated above
      type: DataTypes.DECIMAL(10, 2)
    }
  }, {
    tableName: 'order_list',
    timestamps: true,
    createdAt: 'created_at',
    updatedAt: 'updated_at',
    // paranoid: true
  });