Как игнорировать определенный внешний ключ в sequelize при объединении таблиц? - PullRequest
1 голос
/ 01 мая 2019

Последние пару часов я дергал себя за волосы, чтобы понять это. Я использую 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 для обоих столбцов.

Есть ли способ, например, при запросе я мог бы указать, чтобы игнорировать / исключить этот конкретный внешний ключ?

Если нет, то как мне достичь своих целей здесь?

Помощь будет очень признателен, спасибо за чтение длинного поста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...