左边排除加入续集

时间:2017-03-30 15:24:19

标签: sequelize.js

我有两个表,其中一个表具有另一个表的ID。 1:1的关系。 像

这样的东西
EventFeedback
    somePrimaryKey
    userEventID
UserEvent
    userEventID

Sequalize具有与

定义的关系
models.UserEvent.hasOne(models.EventFeedback, { foreignKey: 'userEventID' });

我需要UserEventEventFeedback中没有条目的所有条目,这是一个排他性加入。 窃取this article中的图片,因为它们具有漂亮的单独图像:left excluding join

他们甚至提供示例代码!

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

我如何在续集中这样做? 我是否只需要进行左连接并手动处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

在查询EventFeedback并添加正确的UserEvent子句时,您需要急切加载where。您还需要定义结果中不需要EventFeedback,以便查询生成LEFT JOIN而不是INNER JOIN

UserEvent.all({
    include: [
        model: EventFeedback,
        required: false, // do not generate INNER JOIN
        attributes: [] // do not return any columns of the EventFeedback table
    ],
    where: sequelize.where(
        sequelize.col('EventFeedback.userEventID'),
        'IS',
        null
    )
}).then(userEvents => {
    // user events...
});

在上面的代码中,sequelize是Sequelize的一个实例,其中定义了模型。您还可以参考sequelize.where()sequelize.col()方法的文档。

答案 1 :(得分:0)

默认情况下,SEQUALIZE始终使用INNER JOIN。 使其成为LEFT JOIN非常容易。 只需添加...

required: false 

以及代码。 请遵循示例查询代码。

 UserModel.findAll({
        attributes: {
            exclude: ['role_id', 'username', 'password', 'otp', 'active']
        },
        where: {
            active: 1,
            role_id: 2
        },
        include: [{
            model: StateModel,
            attributes: ['id', 'short_name'],
            as: 'state_details',
            where: {
                active: 1
            },
            required: false
        }]
    }).then(List => {
        console.log(List);
    }).catch(err => {
        console.log(err);            
 });