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)
app01/ |-app/ |-database/ | `-database.js |-models/ | |-employee.js | |-relations.js | `-rank.js `-index.js
A szerver belépési pontja lehet:
import sequelize from "../database/database.js"; import { DataTypes } from "sequelize"; const Employee = sequelize.define("employee", { name: { type: DataTypes.STRING, allowNull: false } }); export default Employee;
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:
//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.
//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`) })
import sequelize from "../database/database.js"; import { DataTypes } from "sequelize"; const Project = sequelize.define("project", { name: { type: DataTypes.STRING, allowNull: false } }); export default Project;
//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);
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.
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:
//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') }, });
Importálnunk kell a Rank modelt az Employee modell állományában.
import Rank from './rank.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' })
Ha szeretnénk az adatbázisban is meg legyen a hivatkozás a ranks táblára:
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
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'] } })
{ "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ő" } } ] }