无法使用sequelize选择多个表

问题描述 投票:0回答:1

我在使用两个表中包含的主编号选择员工和休假数据时感到非常困惑。有人可以帮助我吗,这是代码:

karyawan 模型文件:

'use strict';

module.exports = (sequelize, DataTypes) => {
  const Karyawan = sequelize.define('Karyawan', {
    nomorInduk: DataTypes.STRING,
    nama: DataTypes.STRING,
    alamat: DataTypes.STRING,
    tanggalLahir: DataTypes.DATE,
    tanggalBergabung: DataTypes.DATE
  }, {});
  Karyawan.associate = function (models) {
    Karyawan.hasMany(models.Cuti, { foreignKey: 'nomorInduk' });
  };
  return Karyawan;
};

索引模型文件:

'use strict';

const Sequelize = require('sequelize');
const dotenv = require('dotenv');
const db = {};

const KaryawanModel = require('./karyawan');
const CutiModel = require('./cuti');

dotenv.config();

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
    host: process.env.DB_HOST,
    dialect: 'mysql',
    logging: console.log
  });
  
  sequelize.sync({ force: false })
  .then(() => {
      console.log('Database synchronized');
  })
  .catch((error) => {
      console.error('Failed to synchronize database:', error);
  });

  const Karyawan = KaryawanModel(sequelize, Sequelize);
  const Cuti = CutiModel(sequelize, Sequelize);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

// Set up associations inside the models
Karyawan.associate({ Cuti });
Cuti.associate({ Karyawan });

module.exports = { db, Karyawan, Cuti };

cuti模型文件:

'use strict';

module.exports = (sequelize, DataTypes) => {
  const Cuti = sequelize.define('Cuti', {
    nomorInduk: DataTypes.STRING,
    tanggalCuti: DataTypes.DATE,
    lamaCuti: DataTypes.INTEGER,
    keterangan: DataTypes.TEXT
  }, {});
  Cuti.associate = function (models) {
    Cuti.belongsTo(models.Karyawan, { foreignKey: 'nomorInduk' });
  };
  return Cuti;
};

获取 karyawan 和 cuti 数据的处理程序:

async function getKaryawanByNomorInduk(req, res) {
    try {
        const nomorInduk = req.params.nomorInduk;

        const karyawan = await models.Karyawan.findOne({
            where: {
                nomorInduk: nomorInduk
            },
            include: [{
                model: models.Cuti,
                attributes: ['id', 'nomorInduk', 'tanggalCuti', 'lamaCuti', 'keterangan'],
            }],
        });

        if (!karyawan) {
            return res.status(404).json({ message: 'Tidak ada data karyawan dengan nomor induk tersebut.' });
        }

        const result = {
            status: 'ok',
            data: karyawan,
        };

        res.json(result);
    } catch (error) {
        res.status(500).json({ message: 'Gagal mendapatkan data karyawan.', error: error.message });
    }
}

我总是得到这样的结果: Result I got

我想要的是这样的结果: The result I want

node.js express sequelize.js sequelize-cli
1个回答
0
投票

既然您只指定了

foreignKey: 'nomorInduk'
,那么
Cuti
将链接到
Karyawan
,如下所示: Cuti.nomorInduk=Karyawan.id 因为如果您没有指定 1:n 关系中 1 个表的键 Sequelize自动使用主键字段,在本例中为
id
。只需在
hasMany
belongsTo
关联中明确指示另一侧键即可:

Cuti.belongsTo(models.Karyawan, { foreignKey: 'nomorInduk', targetKey: 'nomorInduk' });
Karyawan.hasMany(models.Cuti, { foreignKey: 'nomorInduk', sourceKey: 'nomorInduk' });

请注意,为了使此类关系与非默认主表关键字段一起使用,您需要在

nomorInduk
表中的
Karyawan
列上添加唯一索引。

© www.soinside.com 2019 - 2024. All rights reserved.