Tartalomjegyzék

< Express

Express - Táblák kapcsolása ES

Táblák

employees(id, name, city, salary, rankId)
ranks(id, name)
projects(id, name, description, startDate)
employee_project(employeeId, projectId)

Az átláthatóság kedvéért dolgozzunk egyszerűbb táblákkal:

employees(id, name, rankId)
ranks(id, name)
projects(id, name)
employee_project(employeeId, projectId)

Szervezés

app01/
  |-app/
     |-database/
     |   `-database.js
     |-models/
     |   |-employee.js
     |   |-relations.js
     |   `-rank.js
     `-index.js

A szerver belépési pontja lehet:

app/models/employee.js
import sequelize from "../database/database.js";
import { DataTypes } from "sequelize";
 
const Employee = sequelize.define("employee", {
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
});
 
export default Employee;
app/models/rank.js
import sequelize from "../database/database.js";
import { DataTypes } from "sequelize";
 
const Rank = sequelize.define("rank", {
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
});
 
export default Rank;

A kapcsolatokhoz lehetséges nevek:

app/models/relations.js
//Asszociációk, kapcsolatok
import Employee from "./employee.js";
import Rank from "./rank.js";
 
const db = {};
 
db.Employee = Employee;
db.Rank = Rank;
 
db.Employee.belongsTo(db.Rank);
db.Rank.hasMany(db.Employee);
 
export default db;

Az app/index.js fájlban importáljuk az app/models/relations.js tartalmát, de nem használjuk. Csak azért importáljuk, hogy lefussanak az utasítások benne.

app/index.js
//Futtassuk a relations tartalmát:
import relations from "./models/relations.js"
 
//Szükséges az adatbáziskapcsolat:
import sequelize from "./database/database.js"
 
//Szinkronizáljuk az adatbázist
sequelize.sync({ alter: true })
 
//Elkészítjük a szervert:
import express from "express"
const app = express()
 
app.get('/msg', (req, res) => {
    res.send('Hello World!')
})
 
 
app.listen(8000, () => {
    console.log(`Listening on port 8000`)
})

Több a többhöz kapcsolat

app/models/projects.js
import sequelize from "../database/database.js";
import { DataTypes } from "sequelize";
 
const Project = sequelize.define("project", {
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
});
 
export default Project;
app/models/relations.js
//Asszociációk, kapcsolatok
 
import Employee from "./employee.js";
import Project from "./project.js";
 
const db = {};
 
db.Employee = Employee;
db.Project = Project;
 
db.Employee.belongsToMany(db.Project, { through: "employee_project" });
db.Project.belongsToMany(db.Employee, { through: "employee_project" });
 
export default db;

Ami létrejön tábla:

Használat:

const employee = await Employee.findByPk(1);
const project = await Project.findByPk(1);
 
//Automatikusan létrejött az addProject() függvény:
await employee.addProject(project);

Több a többhöz plusz start dátum

Ha szeretnénk egy az idegenkulcsokhoz egy plusz mezőt is hozzáadni. Például mikor került a dolgozó a projekthez. Ekkor létre kell hozni a modellt, de az idegenkulcsokat nem szükséges megadni, azok automatikusan létrejönnek.

app/models/employeeProject.js
import sequelize from "../database/database.js";
import { DataTypes } from "sequelize";
 
const EmployeeProject = sequelize.define("employee_project", {
    startedOn: {
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW
    }
});
 
export default EmployeeProject;

Ebben az esetben többesszámban jön létre a tábla:

app/models/relations.js
//Asszociációk, kapcsolatok
 
import Employee from "./employee.js";
import Rank from "./rank.js";
import Project from "./project.js";
import EmployeeProject from "./employeeProject.js";
 
const db = {};
 
db.Employee = Employee;
db.Rank = Rank;
db.Project = Project;
db.EmployeeProject = EmployeeProject;
 
db.Employee.belongsTo(db.Rank);
db.Rank.hasMany(db.Employee);
 
db.Employee.belongsToMany(db.Project, { 
    through: db.EmployeeProject,
    foreignKey: 'employeeId'
});
db.Project.belongsToMany(db.Employee, { 
    through: db.EmployeeProject,
    foreignKey: 'projectId'
});
 
export default db;

Használat:

// Példa: egy új alkalmazott hozzáadása egy projekthez a csatlakozás dátumával
const employee = await Employee.findByPk(1);
const project = await Project.findByPk(10);
 
await employee.addProject(project, {
  through: {
    startedOn: new Date('2025-09-12')
  },
});

Függelék

Model

Importálnunk kell a Rank modelt az Employee modell állományában.

import Rank from './rank.js'
employees.js
import { DataTypes } from 'sequelize'
import sequelize from '../database/database.js'
import Rank from './rank.js'
 
const Employee = sequelize.define('employee', {
    id: { 
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    name: { type: DataTypes.STRING,  allowNull: false  },
    city: { type: DataTypes.STRING,  allowNull: true  },
    salary: { type: DataTypes.DOUBLE,  allowNull: true  },
    rankId: { type: DataTypes.INTEGER,  allowNull: true  }
})
 
Employee.belongsTo(Rank, { foreignKey: 'rankId' })
 
 
sequelize.sync({
    force: false
})
 
export default Employee

Megadható a ranks táblában a célmező is:

Employee.belongsTo(Rank, { 
    foreignKey: 'rankId',
    targetKey: 'id' 
})

Hivatkozás az adatbázisban

Ha szeretnénk az adatbázisban is meg legyen a hivatkozás a ranks táblára:

employees.js
import { DataTypes } from 'sequelize'
import sequelize from '../database/database.js'
import Rank from './rank.js'
 
const Employee = sequelize.define('employee', {
    id: { 
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    name: { type: DataTypes.STRING,  allowNull: false  },
    city: { type: DataTypes.STRING,  allowNull: true  },
    salary: { type: DataTypes.DOUBLE,  allowNull: true  },
    rankId: { 
        type: DataTypes.INTEGER,  
        allowNull: true,
        references: {
            model: Rank,
            key: 'id'
        }
    }
})
 
Employee.belongsTo(Rank, {
    foreignKey: 'rankId'
})
 
sequelize.sync({
    force: false
})
 
export default Employee

Kontroller

A dolgozók lekérdezéséhez kapcsoljuk a beosztásokat.

const employees = await Employee.findAll({
    include: ['rank']
})

Megadhatjuk milyen mezőket szeretnénk látni. Ehhez a megoldáshoz importáljuk a employeecontroller.js fájlban a Rank modellt.

import Rank from '../models/rank.js'
//...
 
const employees = await Employee.findAll({
    include: {
        model: Rank,
        attributes: ['name']
    }
})

Lehetséges kimenet

{
  "success": true,
  "data": [
    {
      "id": 1,
      "name": "Erős István",
      "city": "Szeged",
      "salary": 395,
      "rankId": 1,
      "createdAt": "2025-07-28T09:15:14.714Z",
      "updatedAt": "2025-07-28T09:15:14.714Z",
      "rank": {
        "name": "fejlesztő"
      }
    },
    {
      "id": 2,
      "name": "Tápos István",
      "city": "Szolnok",
      "salary": 392,
      "rankId": 2,
      "createdAt": "2025-07-28T09:15:22.634Z",
      "updatedAt": "2025-07-28T09:15:22.634Z",
      "rank": {
        "name": "tesztelő"
      }
    }
  ]
}