Последние пару часов я дергал себя за волосы, чтобы понять это. Я использую sequelize
orm для приложения express
. Документ sequelize
меня очень смущает, и я пытался найти решения, но пока ничего не получилось.
У меня есть три ассоциации
//models/device.js
device.associate = function(models) {
device.hasMany(models.actuator_activity, {
foreignKey: 'actuator_device_id',
as: 'actuator_activities',
});
device.hasMany(models.actuator_activity, {
foreignKey: 'sensor_device_id',
});
device.hasMany(models.sensor_data, {
foreignKey: 'sensor_device_id',
as: 'sensor_data',
});
};
//models/sensordata.js
sensor_data.associate = function(models) {
sensor_data.belongsTo(models.device, {
foreignKey: 'sensor_device_id',
onDelete: 'CASCADE',
});
};
//models/actuatoractivity.js
actuator_activity.associate = function(models) {
actuator_activity.belongsTo(models.device, {
foreignKey: 'actuator_device_id',
onDelete: 'CASCADE',
});
actuator_activity.belongsTo(models.device, {
foreignKey: 'sensor_device_id',
onDelete: 'CASCADE',
});
};
выполнение этого запроса
device.findAll({include:[{model: sensor_data, as: 'sensor_data'}, {model: actuator_activity, as: 'actuator_activities'}]})
возвращает это:
{
"id": 2,
"name": "TEST DEVICE 2",
"role": "SENSOR",
"type": "SOIL MOISTURE",
"io_pin": 5,
"added_timestamp": "2019-05-01T12:18:08.317Z",
"client_added_timestamp": "2019-04-23T20:44:29.597Z",
"min_value": 0,
"max_value": 1000,
"sensor_data": [
{
"id": 2,
"sensor_device_id": 2,
"created_timestamp": "2019-04-23T20:44:29.597Z",
"sensor_value": 300
}
],
"actuator_activities": [
{
"id": 1,
"created_timestamp": "2019-04-23T20:44:29.597Z",
"name": "Motor turned on",
"actuator_device_id": 1,
"sensor_device_id": 2
}
]
},
{
"id": 1,
"name": "TEST DEVICE 1",
"role": "ACTUATOR",
"type": "MOTOR",
"io_pin": 7,
"added_timestamp": "2019-05-01T12:17:14.026Z",
"client_added_timestamp": "2019-04-23T20:44:29.597Z",
"min_value": 0,
"max_value": 1,
"sensor_data": [],
"actuator_activities": []
}
но я хочу получить вот что:
{
"id": 2,
"name": "TEST DEVICE 2",
"role": "SENSOR",
"type": "SOIL MOISTURE",
"io_pin": 5,
"added_timestamp": "2019-05-01T12:18:08.317Z",
"client_added_timestamp": "2019-04-23T20:44:29.597Z",
"min_value": 0,
"max_value": 1000,
"sensor_data": [
{
"id": 2,
"sensor_device_id": 2,
"created_timestamp": "2019-04-23T20:44:29.597Z",
"sensor_value": 300
}
],
},
{
"id": 1,
"name": "TEST DEVICE 1",
"role": "ACTUATOR",
"type": "MOTOR",
"io_pin": 7,
"added_timestamp": "2019-05-01T12:17:14.026Z",
"client_added_timestamp": "2019-04-23T20:44:29.597Z",
"min_value": 0,
"max_value": 1,
"actuator_activities": [
{
"id": 1,
"created_timestamp": "2019-04-23T20:44:29.597Z",
"name": "Motor turned on",
"actuator_device_id": 1,
"sensor_device_id": 2
}
]
}
Идея состоит в том, чтобы сопоставить id
с вложенными actuator_device_id
и sensor_device_id
если я удаляю ассоциации с actuator_activity
и devices
с внешним ключом sensor_device_id
Это работает, как я ожидаю, но мне нужно сохранить это, потому что мне нужен параметр каскадирования для actuator_activity
для обоих столбцов.
Есть ли способ, например, при запросе я мог бы указать, чтобы игнорировать / исключить этот конкретный внешний ключ?
Если нет, то как мне достичь своих целей здесь?
Помощь будет очень признателен, спасибо за чтение длинного поста.