Node.js - Sequelize.js嵌套关联检查外部条件 - 未定义

问题描述 投票:8回答:3

使用Sequelize版本实现:“^ 4.15.0”

我试图从包含的关联中的2级添加where条件。

Model1.find({
    include: [
       {
           model: Model2,
           as: 'model2_alias',
           attributes: [
               'model2_id'
           ],
           include: [{
               model: Model3,
               as: 'model3_alias',
               attributes: [
                   'model3_id'
               ]
           }]
       }
    ],
    where: {
        model3_alias.id: { [Op.in]: [1, 2, 3] }
    }
});

我累了这个方法:

where: {
    '$model2_alias.model3_alias.id$': { [Op.in]: [1, 2, 3] }
}

但是给出了model2_alias.model3_alias.id未定义/未找到的错误。

当写为'$model2_alias.id$': { [Op.in]: [1, 2, 3] }时,上面的确有效,因此语法必须写入,但如何再降低一级。

在任何MySQL管理工具中执行形成的SQL语句时,给出正确的结果,因此我尝试实现的where条件也没有错。

我在这里缺少的任何想法或仅适用于一个级别。然后该怎么做更多级别?

node.js associations sequelize.js where-clause nested-query
3个回答
3
投票

你可以在任何级别添加这样的地方 -

Model.find({
    where : { 
    // where 1
    },
    include : [{
        model : Model1,
        where : {
        // Where 2
        },
        include : [{
            model : Model2,
            where : {
            // Where 3
            }
        }]
    }]

});

希望有所帮助!


0
投票

我假设您的代码不起作用,因为您使用model1_id而不是id。所以代码应该是

Model1.find({
    include: [
       {
           model: Model2,
           as: 'model2_alias',
           attributes: [
               'id'
           ],
           include: [{
               model: Model3,
               as: 'model3_alias',
               attributes: [
                   'id'
               ]
           }]
       }
    ],
    where: {
        '$model2_alias.model3_alias.id$': { [Op.in]: [1, 2, 3] }
    }
});

另外,正如@Rahul所提到的,您也可以直接在包含内部使用

Model1.find({
    include: [
       {
           model: Model2,
           as: 'model2_alias',
           attributes: [
               'id'
           ],
           include: [{
               model: Model3,
               where: {
                  'id': { [Op.in]: [1, 2, 3] }
               }
               as: 'model3_alias',
               attributes: [
                   'id'
               ]
           }]
       }
    ],
});

0
投票

此外,你可以试试

sequelize.where()

EG

sequelize.where(
      sequelize.literal('"model2_alias.model3_alias.id"'), { [Op.in]: [1, 2, 3] }
    )

关于sub query,这意味着你使用limit / offset +(1:m关系或有left join)。如果你有1:1关系,只需将required: true添加到include,你将获得inner join而不是left joinsequelize不会创建sub query

© www.soinside.com 2019 - 2024. All rights reserved.