Запрос Sequilize возвращает только одну строку при использовании include - PullRequest
0 голосов
/ 05 марта 2020

Контекст: У меня возникла эта проблема, когда я выполняю запрос с использованием sequilize и он возвращает мне только массив с одной позицией, даже если у меня более одного поля, соответствующего запросу.

Это две мои вовлеченные модели

Это моя группа . js модель

module.exports = (sequelize, DataTypes) => {
    const Group = sequelize.define('Group', {
        name: DataTypes.STRING,
        limit: DataTypes.STRING,
        user_id: DataTypes.INTEGER
    });

    Group.associate = models => {
        Group.belongsTo(models.User, { foreignKey: 'user_id' });
    };

    Group.associate = models => {
        Group.hasMany(models.Movement, { foreignKey: 'group_id' });
    };

    return Group;
}

Это моя движение. js модель

module.exports = (sequelize, DataTypes) => {
    const Mov = sequelize.define('Movement', {
        description: DataTypes.STRING,
        value: DataTypes.INTEGER,
        group_id: DataTypes.INTEGER
    });

    Mov.associate = models => {
        Mov.hasOne(models.Group, { foreignKey: 'group_id' });
    };

    return Mov;
}

Это мой запрос (где вы увидите, что я делаю от INNER JOIN до SUM полей Движение таблица)

router.get('/', verify, async (req, res) => {
    try {
        const group = await Group.findAll({
            attributes: [
                'id',
                'name',
                'limit',
                [sequelize.fn('SUM', sequelize.col('Movements.value')), 'total_spent'],
            ],
            include: [{
                attributes: [], // this is empty because I want to hide the Movement object in this query (if I want to show the object just remove this)
                model: Movement,
                required: true
            }],
            where: {
                user_id: req.userId
            }
        });
        if (group.length === 0) return res.status(400).json({ error: "This user has no groups" })
        res.status(200).json({ groups: group }) //TODO see why this is onyl return one row
    } catch (error) {
        console.log(error)
        res.status(400).json({ Error: "Error while fetching the groups" });
    }
});

Проблема в том, что она возвращает только одну позицию ожидаемого массива:

{
    "groups": [
        {
            "id": 9,
            "name": "rgrgrg",
            "limit": 3454354,
            "total_spent": "2533"
        }
    ]
}

It следует вернуть 2 позиции

{
    "groups": [
        {
            "id": 9,
            "name": "rgrgrg",
            "limit": 3454354,
            "total_spent": "2533"
        },
    {
            "id": 9,
            "name": "rgrgrg",
            "limit": 3454354,
            "total_spent": "2533"
        }
    ]
}

Это запрос сиквиллизации дает мне:

SELECT `Group`.`id`, `Group`.`name`, `Group`.`limit`, SUM(`Movements`.`value`) AS `total_spent` FROM `Groups` AS `Group` INNER JOIN `Movements` AS `Movements` ON `Group`.`id` = `Movements`.`group_id` WHERE `Group`.`user_id` = 1;

1 Ответ

1 голос
/ 05 марта 2020

Полагаю, вам нужно добавить соответствующую группу по выражению следующим образом -

const group = await Group.findAll({
    attributes: [
        'id',
        'name',
        'limit',
        [sequelize.fn('SUM', sequelize.col('Movements.value')), 'total_spent'],
    ],
    include: [{
        attributes: [], // this is empty because I want to hide the Movement object in this query (if I want to show the object just remove this)
        model: Movement,
        required: true
    }],
    where: {
        user_id: req.userId
    },
    group: '`Movements`.`group_id`'
});
...