Node.js mysql отношения многие ко многим - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь создать для продуктов и категорий отношения между многими со значениями node.js и mysql без использования Sequelize. Или я должен определенно использовать это?

При подключении к БД создаются таблицы со связями:

connection.connect((err) => {
    if (err) {
        return console.error("error: " + err.message);
    } else {
        console.log("Connected to the MySQL server.");
        let createProducts = `CREATE TABLE IF NOT EXISTS products(
                                product_id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, 
                                name VARCHAR (255) NOT NULL, 
                                description VARCHAR (255),
                                price DECIMAL (19,2),
                                sku VARCHAR (255),
                                image VARCHAR (255),
                                created_at TIMESTAMP NOT NULL DEFAULT NOW(),
                                updated_at TIMESTAMP NOT NULL DEFAULT NOW() ON UPDATE now())`;
        let createCategories = `CREATE TABLE IF NOT EXISTS categories(
                                category_id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, 
                                name VARCHAR (255) NOT NULL, 
                                created_at TIMESTAMP NOT NULL DEFAULT NOW(),
                                updated_at TIMESTAMP NOT NULL DEFAULT NOW() ON UPDATE NOW())`;
        let createProductsCategories = `CREATE TABLE IF NOT EXISTS products_categories(
                                id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
                                product_id INT UNSIGNED NOT NULL,
                                category_id INT UNSIGNED NOT NULL,
                                FOREIGN KEY (product_id) REFERENCES products (product_id) ON DELETE CASCADE,
                                FOREIGN KEY (category_id) REFERENCES categories (category_id) ON DELETE CASCADE,
                                created_at TIMESTAMP NOT NULL DEFAULT NOW(),
                                updated_at TIMESTAMP NOT NULL DEFAULT NOW() ON UPDATE NOW())`;
        connection.query(createProducts, function (err, results, fields) {
            if (err) {
                console.log(err.message);
            }
        });
        connection.query(createCategories, function (err, results, fields) {
            if (err) {
                console.log(err.message);
            }
        });
        connection.query(createProductsCategories, function (err, results, fields) {
            if (err) {
                console.log(err.message);
            }
        });
    }
});

Что еще я должен включить в модель продукта / категорию / контроллер, чтобы связь между ними работала? И данные будут вставлены в таблицу products_categories при создании продукта с категорией?

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

const Categories = require("category.model");

// constructor
const Product = function (product) {
    this.name = product.name;
    this.description = product.description;
    this.price = product.price;
    this.sku = product.sku;
    this.image = product.image;
};

Product.create = (newProduct, result) => {
    mysql.query("INSERT INTO products SET ?", newProduct, (err, res) => {
        if (err) {
            result(err, null);
            return;
        }
        result(null, {id: res.insertId, ...newProduct});
    });
};

Контроллер продукта:

const Product = require("../models/product.model.js");

exports.create = (req, res) => {
    if (!req.body) {
        res.status(400).send({
            message: "Content can not be empty!"
        });
    }
    const product = new Product({
        name: req.body.name,
        description: req.body.description,
        price: req.body.price
    });
    Product.create(product, (err, data) => {
        if (err)
            res.status(500).send({
                message:
                    err.message || "Error occurred while creating the new Product."
            });
        else res.send(data);
    });
};

Маршруты продуктов :

module.exports = app => {
    const products = require("../controllers/product.controller.js");
    app.post("/products", products.create);

Категория модели:

const Category = function (category) {
    this.name = category.name;
};

Category.create = (newCategory, result) => {
    mysql.query(`INSERT INTO categories SET ?`, newCategory, (err, res) => {
        if (err) {
            result(err, null);
            return;
        }
        result(null, {id: res.insertId, ...newCategory});
    });
};

1 Ответ

0 голосов
/ 14 января 2020

Требуется ли использовать Sequelize?

Краткий ответ: Нет.

Длинный ответ: Sequelize - это ORM, который помогает упростить различные операции с БД и сохранить ваше время и энергия. Вот почему рекомендуется использовать ORM, чтобы вы могли больше сосредоточиться на бизнес-логике c, а не беспокоиться об управлении операциями с БД.

А также Sequelize - не единственная ORM, с помощью которой можно достичь этих целей. .

Здесь вы можете найти список самых популярных ORM.

Как будет работать соотношение между продуктами и категориями?

Ваша схема выглядит хорошо. Теперь, если вы сделаете вставку правильно, она выполнит свою работу.

При вставке убедитесь, что вы выполнили следующие шаги.

  1. Вставьте в продукты
  2. Вставьте в категории
  3. Возьмите product_id и category_id и вставьте в product_categories.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...