我有 2 个型号,business
和documents
在 1:n
关系,我想过滤 business
有两种方式,
-
business
有documents
每一个document.due_balance
大于0 -
business
有documents
每一个document.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;
这些将得到我想要的东西,问题是以前的代码是用sequelize ORM制作的,我无法更改它,像这样
const 企业 = 等待 db.business.paginate({ 属性: [ ... ], 在哪里: { ...//一堆地方 }, 页面:parseInt(params.page, 10) || 1、 分页: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,
});
但这根本不起作用,我该如何解决这个问题?
最佳答案
我认为如果没有 GROUP,HAVING 就无法发挥作用。
我会将having 子句移到include 部分之外并使用AS 别名。
所以,粗略地说:
group: ['id'],//以及您需要的其他内容
有:{'documents.total_balance_due':{$eq:0}}
(对别名进行一些猜测)
关于mysql - 如何在与sequelize Node 的关系上使用having子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809779/