使用 Sequelize 计算同一模型的多个关联条目

问题描述 投票:0回答:1

我有两张桌子,

transaction
account
transaction
至少有一个,并且可以选择通过两个不同的外键关联第二个
account
使用 Sequelize (6.32.0),如何通过第一个 (id_account) 或第二个 (id_account_destination) 外键对与
transaction
关联的所有
account
进行计数?

sql查询实现:

SELECT `account`.`id`, `account`.`name`, COUNT(`transactions`.`id`) AS `transaction_count`
    FROM  `accounts` AS `account`
    LEFT OUTER JOIN `transactions` AS `transactions`
    ON `account`.`id` = `transactions`.`id_account`
    OR `account`.`id` = `transactions`.`id_account_destination`
    GROUP BY `transactions`.`id_account`;

型号定义:

// account
module.exports = (sequelize, Sequelize) => {
    return sequelize.define("account", {
        id: {
            primaryKey: true,
            type: DataTypes.UUID,
            defaultValue: DataTypes.UUIDV4
        },
        name: {
            type: DataTypes.STRING
        }
    });
};

// transaction
module.exports = (sequelize, Sequelize) => {
    return sequelize.define("transaction", {
        id: {
            primaryKey: true,
            type: DataTypes.UUID,
            defaultValue: DataTypes.UUIDV4
        },
        id_account: {
            type: DataTypes.UUID
        },
        id_account_destination: {
            type: DataTypes.UUID,
            allowNull: true
        },
        amount: {
            type: DataTypes.DOUBLE
        }
    });
};

模型关系:

db.transaction.belongsTo(db.accounts, { foreignKey: 'id_account', as: 'account' });
db.transaction.belongsTo(db.accounts, { foreignKey: 'id_account_destination', as: 'account_destination' });

通过一个关联进行计数的工作解决方案: (仍然想知道为什么他通过 id_account_destination 选择第二个关联)

    db.accounts.findAll({
        subQuery: false,
        attributes: {
            include: [[db.sequelize.fn('COUNT', db.sequelize.col('transactions.id')), 'transaction_count']],
        },
        include: [
            { model: db.transaction, attributes: [] }
        ],
        group: ['transactions.id_account']
    })

尝试出现错误“无法读取未定义的属性(读取'getTableName')”

    db.accounts.findAll({
        subQuery: false,
        attributes: {
            include: [[db.sequelize.fn('COUNT', db.sequelize.col('transactions.id')), 'transaction_count']],
        },
        include: [
            { model: db.transaction, attributes: [], through: 'account_destination' }
            { model: db.transaction, attributes: [], through: 'account' }
        ],
        group: ['transactions.id_account']
    })
mysql node.js sequelize.js
1个回答
0
投票

你能解决这个问题吗?我也遇到同样的问题了兄弟

© www.soinside.com 2019 - 2024. All rights reserved.