在Egg使用Sequelize过程中,发现Sequelize的include不能使用自定义的SQL语句,只能像这样使用
include: [
{
model: app.model.Examine,
attributes: [],
required: false
}
]
。想Left Join返回自定义的属性(如使用min,sum计算后的属性),想include直接使用sql语句,都不行,找来找去也找不到方法。有读者可能会问“为什么不使用原始查询语句了?“,如果我使用原始查询语句,那么Sequelize里好用的Sequelize.Op,Sequelize.where这些我都不能使用,需要自己完整写出SQL语句,大哥,我就只是include里使用一下聚合函数或自定义一下而已,得不偿失。
于是我看了下Sequelize的源码,改源码吧,没办法中的办法。最后找到include生成语句的代码在node_modules\sequelize\lib\dialects\abstract\query-generator.js的selectQuery函数里,于是在selectQuery函数加上以下代码
subJoinQueries = subJoinQueries.concat(joinQueries.subQuery);
//加的就是下面这一行
mainJoinQueries = include.customInclude ? mainJoinQueries.concat(include.customInclude) : mainJoinQueries.concat(joinQueries.mainQuery);
if (joinQueries.attributes.main.length > 0) {
attributes.main = _.uniq(attributes.main.concat(joinQueries.attributes.main));
}
mainJoinQueries = include.customInclude ? mainJoinQueries.concat(include.customInclude) : mainJoinQueries.concat(joinQueries.mainQuery);
当我的include有传递customInclude属性时,直接使用customInclude属性,从而达到自定义include或Left Join或sql,真的真的很好用,就改一行代码就OK了。
使用方法如下:
inlucde: [
{
model: app.model.E,
attributes: [],
required: false,
customInclude: ` LEFT JOIN ( select id, count(1) as ExamineCount FROM Examine)t_Examine ON t_Examine.id = Project.id
}
]