关于Egg Sequelize不能自定义include问题,Sequelize include使用自定义SQL或聚合函数

        在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
            }
]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶恭介叶恭介

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值