Node.js: relazioni tra modelli in Sequelize

Node.js: relazioni tra modelli in Sequelize

Sequelize è un ORM (Object-Relational Mapping) per Node.js che semplifica l'interazione con i database relazionali come MySQL, PostgreSQL e SQLite. Quando si lavora con database, è spesso necessario gestire le relazioni tra le tabelle, e Sequelize offre un modo elegante per farlo. In questo articolo, esploreremo come definire e gestire le relazioni tra modelli in Sequelize./p>

Definizione dei modelli

Per iniziare a gestire le relazioni tra i modelli, è necessario definire i modelli stessi. Ad esempio, supponiamo di dover gestire una semplice applicazione di e-commerce con due entità principali: User e Product. Ecco come potrebbero apparire le definizioni dei modelli Sequelize per queste entità:


const { Sequelize, DataTypes } = require('sequelize');

const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'mysql',
  host: 'localhost',
});

const User = sequelize.define('User', {
  username: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  // Altri campi del modello User
});

const Product = sequelize.define('Product', {
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  price: {
    type: DataTypes.DECIMAL(10, 2),
    allowNull: false,
  },
  // Altri campi del modello Product
});

Definizione delle relazioni

Una volta definiti i modelli, è possibile definire le relazioni tra di essi. In questo caso, vogliamo stabilire una relazione tra User e Product, in cui un utente può avere molti prodotti e un prodotto può essere posseduto da un solo utente. Questo è un tipico esempio di relazione uno a molti (one-to-many).

Per definire questa relazione, è necessario utilizzare i metodi Sequelize belongsTo e hasMany. Ecco come farlo:


User.hasMany(Product, { as: 'products', foreignKey: 'userId' });
Product.belongsTo(User, { foreignKey: 'userId' });

Nel codice sopra, stiamo dicendo a Sequelize che un utente "ha molti" prodotti, e un prodotto "appartiene a" un utente. Inoltre, stiamo specificando una chiave esterna userId che collega i due modelli.

Esempi di utilizzo

Ora che abbiamo definito le relazioni, possiamo usarle per eseguire query complesse che coinvolgono entrambi i modelli. Ecco alcuni esempi di come potremmo utilizzare queste relazioni:

Creare un nuovo utente e prodotti associati


const user = await User.create({
  username: 'john_doe',
});

const product1 = await Product.create({
  name: 'Smartphone',
  price: 599.99,
  userId: user.id,
});

const product2 = await Product.create({
  name: 'Laptop',
  price: 999.99,
  userId: user.id,
});

Trovare tutti i prodotti di un utente


const user = await User.findOne({ where: { username: 'john_doe' } });
const products = await user.getProducts();

Trovare il proprietario di un prodotto


const product = await Product.findOne({ where: { name: 'Smartphone' } });
const owner = await product.getUser();

Conclusioni

Sequelize semplifica notevolmente la gestione delle relazioni tra modelli in un'applicazione Node.js. Utilizzando i metodi hasMany e belongsTo, è possibile definire relazioni complesse tra le entità del database e interrogarle in modo intuitivo. Questo è solo un esempio delle molte funzionalità potenti offerte da Sequelize per semplificare lo sviluppo di applicazioni web basate su database relazionali.

Torna su