在关联属性和根属性上对查询进行OR排序

时间:2019-07-10 14:12:55

标签: sequelize.js

我正在尝试执行一个OR语句同时引用根表属性和关联表属性的查询。我尝试了以下失败的操作,因为SQL无法在整个查询范围内访问别名:

const group = await SocialGroup.findOne({
    attributes: ['id'],
    where: {
        id: {
            [Op.eq]: id,
        },
        [Op.or]: [
            {
                adminId: {
                    [Op.eq]: ctx.socialUser.id,
                },
            },
            {
                ['$roles.userId$']: {
                    [Op.eq]: ctx.socialUser.id,
                },
            },
        ],
    },
    include: [
        {
            model: models.SocialGroupRight,
            as: 'roles',
            required: false,
        },
    ],
});

错误消息为Unknown column 'roles.userId' in 'where clause。它确实生成查询。

我最新使用sequelize 4.x

1 个答案:

答案 0 :(得分:0)

看起来像findOne()方法中的错误。使用findAll()测试类似的查询可以得到此SQL,该SQL可以正常运行:

SELECT ... FROM sg LEFT OUTER JOIN sgr ON sg.id = sgr.sg_id WHERE (sg.id = 1 OR sgr.name = 'hello');

但是更改为findOne()会给出此无效的SQL:

SELECT ... FROM ( SELECT ... FROM sg WHERE (sg.id = 1 OR sgr.name = 'hello') LIMIT 1 ) AS xxx LEFT OUTER JOIN sgr ON sg.id = sgr.sg_id;

WHERE子句和LIMIT关键字应用于连接的之前,从而破坏了查询。 FWIW将findAll()与limit: 1一起使用也做了同样的事情。

对不起,我没有更有用的答案。...