Car*_*zar 2 mysql sql orm node.js sequelize.js
我有 2 个模型,business在documents一段1:n关系中,我想用business两种方式过滤,
business其中documentseverydocument.due_balance大于 0business其中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
我认为如果没有 GROUP,HAVING 就不起作用。
我会将having 子句移到include 部分之外并使用AS 别名。
所以,大致来说:
group: ['id'], // and whatever else you need
having : { 'documents.total_balance_due' : {$eq : 0 }}
(对别名进行一些猜测)