如何在与sequ​​elize节点的关系上使用having子句

Car*_*zar 2 mysql sql orm node.js sequelize.js

我有 2 个模型,businessdocuments一段1:n关系中,我想用business两种方式过滤,

  1. business其中documentseverydocument.due_balance大于 0
  2. business其中documentseverydocument.due_balance等于 0

我想做这样的东西

select
    A.name, B.due_balance, sum(B.due_balance) as total_due_balance
from
    business A
inner join documents B ON A.id = B.business_id
group by A.id
having total_due_balance > 0;

select
    A.name, B.due_balance, sum(B.due_balance) as total_due_balance
from
    business A
inner join documents B ON A.id = B.business_id
group by A.id
having total_due_balance = 0;
Run Code Online (Sandbox Code Playgroud)

这些会让我得到我想要的,问题是,以前的代码是用sequelize ORM制作的,我无法改变它,像这样

constbusinesss=awaitdb.business.paginate({attributes:[...],where:{... //一堆where},page:parseInt(params.page,10)||1,paginate:parseInt( params.limit, 10) || 10, });

这是问题开始的地方,我不知道如何连接表并使用必须过滤它,我尝试添加这个

let toInclude;
if (params.contactability === 'with_balance') {
    toInclude = {
        include : [
            {
                attributes: [
                    [db.Sequelize.fn('sum', db.Sequelize.col('due_balance')), 'total_due_balance'],
                ],
                model: db.document,
                as: 'documents',
                having: db.Sequelize.where(db.Sequelize.fn('sum', db.Sequelize.col('due_balance')), {
                    $gt: 0,
                }),
            },
        ],
    };
} else if(params.contactability === 'without_balance') {
    toInclude = {
        include : [
            {
                attributes: [
                    [db.Sequelize.fn('sum', db.Sequelize.col('due_balance')), 'total_due_balance'],
                ],
                model: db.document,
                as: 'documents',
                having: db.Sequelize.where(db.Sequelize.fn('sum', db.Sequelize.col('due_balance')), {
                    $eq: 0,
                }),
            },
        ],
    };
} else {
    toInclude = {};
}
const businesses = await db.business.paginate({
    attributes: [
    ...
    ],
    where: {
    ...
    },
    ...toInclude,
    page: parseInt(params.page, 10) || 1,
    paginate: parseInt(params.limit, 10) || 10,
});
Run Code Online (Sandbox Code Playgroud)

但这根本不起作用,我该如何解决这个问题?

小智 5

  1. 我认为如果没有 GROUP,HAVING 就不起作用。

  2. 我会将having 子句移到include 部分之外并使用AS 别名。

所以,大致来说:

group: ['id'], // and whatever else you need having : { 'documents.total_balance_due' : {$eq : 0 }}

(对别名进行一些猜测)