У меня сложный вопрос, связанный с Sequelize MySQL. У меня есть две модели: Calibration
и Device
, связанные многие-к-одному соответственно.
const Calibration = sequelize.define('Calibration', {
id: {
type: DataTypes.UUID,
primaryKey: true,
defaultValue: DataTypes.UUIDV4
},
date: {
type: DataTypes.DATEONLY,
allowNull: false
},
document: DataTypes.STRING,
status: DataTypes.STRING
});
Calibration.associate = (models) => {
models.Calibration.belongsTo(models.Device, {
foreignKey: 'deviceId',
onDelete: 'CASCADE'
});
};
const Device = sequelize.define('Device', {
id: {
type: DataTypes.STRING,
primaryKey: true,
defaultValue: DataTypes.UUIDV4
},
name: DataTypes.STRING,
description: DataTypes.STRING,
serialNo: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
calibrationPeriod: DataTypes.INTEGER,
location: DataTypes.STRING,
seller: DataTypes.STRING,
servicePartner: DataTypes.STRING,
deviceFunction: DataTypes.STRING,
quantity: DataTypes.INTEGER,
status: DataTypes.STRING,
comment: DataTypes.STRING
});
Теперь дело в том, что я хочу запросить список Device
, объединенный с Calibration
каждый элемент устройства имеет два атрибута даты, ссылающихся на две связанные калибровки, одна с самой последней датой, а другая с ближайшей датой в будущем. Это было довольно сложно, и мне не удалось найти решение. Большое спасибо за вашу помощь.
Обновлено: это моя текущая работа, на самом деле, я еще не удовлетворен этим, так как я предпочитаю другой способ объединить все это только в одном запросе, а не 3 как это:
let result = await Device.findAll({
include: [{ model: Category, attributes: ['id', 'name'] }],
order: [['createdAt', 'DESC']], raw: true
});
await Promise.map(result, async (item, i) => {
const lastCalibration = await Calibration.findAll({
attributes: ['id', 'date'],
where: { date: { [Op.lte]: Sequelize.fn('curdate') }, deviceId: item.id },
include: [{ model: Device, attributes: ['id'] }],
order: [['date', 'DESC']],
limit: 1,
raw: true
});
const nextCalibration = await Calibration.findAll({
attributes: ['id', 'date'],
where: { date: { [Op.gt]: Sequelize.fn('curdate') }, deviceId: item.id },
include: [{ model: Device, attributes: ['id'] }],
order: [['date', 'ASC']],
limit: 1,
raw: true
});
result[i] = { ...item, lastCalibration: lastCalibration[0], nextCalibration: nextCalibration[0] };