Sequelize: как получить сведенные данные при объединении таблиц на основе вложенных ассоциаций? - PullRequest
0 голосов
/ 08 марта 2020

У меня есть отношения, определенные как

device_data.belongsTo(models.device)
device.belongsTo(models.category)
category.belongsTo(models.role)

Я пытаюсь получить все данные устройства, которые подпадают под определенную c роль. Прямо сейчас у меня работает следующее:

const query = {
    include: [{
        model: device,
        attributes: ['id'],
        include: [{
            model: category,
            attributes: ['id'],
            include: [{
                model: role,
                attributes: ['id'],
                where: {
                    id: {
                        [Op.eq]: roleId,
                    },
                },
                required: true,
            }],
            required: true,
        }],
        required: true,
    }],
};

Очевидно, это возвращает мне отформатированные данные, подобные следующим:

{
    "id": 1,
    "created_timestamp": "2019-08-12T12:28:36.194Z",
    "device_id": 1,
    "device_value": 0,
    "initiator_id": 2,
    "device": {
        "id": 1,
        "category": {
            "id": 1,
            "role": {
                "id": 1
            }
        }
    }
},

Где role вложено в 3-й уровень и role.id в 4-м.

Я пытаюсь достичь:

{
    "id": 1,
    "created_timestamp": "2019-08-12T12:28:36.194Z",
    "device_id": 1,
    "device_value": 0,
    "initiator_id": 2,
    "device": 1,
    "category": 1,
    "role": 1
},

Я был бы очень признателен, если бы кто-то мог указать мне подсказку или, возможно, запрос на генерацию таких данных из sequelize , Большое спасибо.

1 Ответ

0 голосов
/ 11 марта 2020

1) Чтобы отключить вложение по модели, используйте raw: true в вашем запросе .

2) Чтобы удалить префикс имени таблицы, переместите атрибуты в модель верхнего уровня, но добавьте псевдоним таблицы.

Например:

TopModel.find( raw: true, attributes : [ 'id', 'created_timestamp', // from main table 'device.id' // from included table ], include [{ model: device, attributes: [], // nothing at this level // etc, etc,

Я просто предполагаю, что device является псевдонимом таблицы. если вы получаете сообщение об ошибке (примерно) «Поле не существует», обратитесь к сгенерированному SQL, чтобы получить правильный псевдоним.

...