我有两个表,其中一个表具有另一个表的ID。 1:1的关系。 像
这样的东西EventFeedback
somePrimaryKey
userEventID
UserEvent
userEventID
Sequalize具有与
定义的关系models.UserEvent.hasOne(models.EventFeedback, { foreignKey: 'userEventID' });
我需要UserEvent
中EventFeedback
中没有条目的所有条目,这是一个排他性加入。
窃取this article中的图片,因为它们具有漂亮的单独图像:
他们甚至提供示例代码!
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
我如何在续集中这样做? 我是否只需要进行左连接并手动处理它?</ p>
答案 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);
});