sequelize - как вернуть простой объект - PullRequest
0 голосов
/ 25 сентября 2018

Я знаю, это звучит как легкий запрос, но я потратил слишком много времени на это.По умолчанию я хочу, чтобы мой вывод из sequelize был простым объектом без каких-либо массивов.

Ранее я использовал raw: true, но в этой ситуации это не сработает.Мне нужно сохранить оригинальное дерево.У меня сложный результат с 4 вложенными ассоциациями.Был пакет от разработчика под названием sequelize-to-json , но после применения его к самой последней версии sequelize у меня все еще были массивы в моем объекте.Я считаю, что плагин может больше не поддерживаться, так как последний коммит был больше года назад.

Вот моя модель:

Namespace.findAll({
    attributes: ['namespace', 'description'],
    include: {
        model: Domain,
        as: 'domains',
        attributes: ['domain', 'description'],
        required: false,
        include: {
            model: Attribute,
            as: 'attributes',
            attributes: ['attribute', 'description'],
            required: false,
            include: {
                model: Value,
                as: 'values',
                attributes: ['type', 'value'],
                required: false,
                where: {
                    [Op.or]: [{ uuid }, { uuid: '00000000-0000-0000-0000-000000000000' }],
                },
                // order: [['id', 'ASC']],
            },
        },
    },
})

Вывод выглядит примерно так:

[
{
    "namespace": "orangeApp",
    "description": "Mobile App Email Notifications",
    "domains": [
        {
            "domain": "notifications",
            "description": "Notifications",
            "attributes": [
                {
                    "attribute": "scheduled_medication",
                    "description": "Scheduled Medication",
                    "values": [
                        {
                            "type": "delivery_method",
                            "value": "push"
                        },
                        {
                            "type": "preview_type",
                            "value": "basic"
                        }
                    ]
                },
                {
                    "attribute": "new_messages",
                    "description": "New Messages",
                    "values": [
                        {
                            "type": "blahhhhhh",
                            "value": "true"
                        }
                    ]
                },
                {
                    "attribute": "friend_requests",
                    "description": "Friend Requests",
                    "values": [
                        {
                            "type": "dc",
                            "value": "true"
                        }
                    ]
                }
            ]
        }
    ]
}
]

Предпочтительный вывод будет примерно таким:

Есть предложения?Я видел много примеров, когда люди получали чистый JSON, но с моими ассоциациями и желанием поддерживать дерево я не видел хорошего примера.Вся помощь приветствуется

1 Ответ

0 голосов
/ 26 сентября 2018

Если вы знаете, что ваш запрос будет возвращать только массив с одним объектом, вы можете использовать метод findOne вместо findAll.Если вы хотите использовать то, что у вас есть, вы можете сделать следующее:

let result = Namespace.findAll({
    attributes: ['namespace', 'description'],
    include: {
        model: Domain,
        as: 'domains',
        attributes: ['domain', 'description'],
        required: false,
        include: {
            model: Attribute,
            as: 'attributes',
            attributes: ['attribute', 'description'],
            required: false,
            include: {
                model: Value,
                as: 'values',
                attributes: ['type', 'value'],
                required: false,
                where: {
                    [Op.or]: [{ uuid }, { uuid: '00000000-0000-0000-0000-000000000000' }],
                },
                // order: [['id', 'ASC']],
            },
        },
    },
})
let cleanResult = result[0].domains[0]

Делайте это только в том случае, если вы возвращаете только один результат И вас интересует только первый объект домена в этих доменах.собственность (которая кажется, как будто вы).

Для подтверждения полученного вами комментария действительно допустимы массивы JSON.

...