提问人:Matt Westwick 提问时间:8/5/2023 更新时间:8/5/2023 访问量:67
续集 (node.js) - 急切地从连接表中的其他外键加载模型
Sequelize (node.js) - Eager Loading a model from additional foreign key in join table
问:
我遇到了一个问题 - 我想急于加载一个额外的模型,该模型包含在 M:N 关系的连接表中。我尝试了一些方法,但无法让它工作。
设置:
const User = sequelize.define('user', {
id: DataTypes.STRING,
username: DataTypes.STRING,
points: DataTypes.INTEGER
}, { timestamps: false });
const Profile = sequelize.define('profile', {
id: DataTypes.STRING,
name: DataTypes.STRING
}, { timestamps: false });
const UserProfiles = sequelize.define('user_profile', {
approved: DataTypes.BOOLEAN
}, { timestamps: false });
User.belongsToMany(Profile, { through: 'User_Profiles' });
Profile.belongsToMany(User, { through: 'User_Profiles' });
UserProfiles.belongsTo(User, { as: 'Approver', foreignKey: { name: "approvedBy" }});
当前查询:
const user = await User.findOne({
where: { username },
include: [
{
model: Profile
},
],
});
返回:
{
id: 'asdf-1234-5678',
username: 'test',
points: 10,
Profiles: [{
id: '1',
name: 'testname',
UserProfiles: {
approved: true,
UserId: 'asdf-1234-5678',
ProfileId: '1',
approvedBy: 'qwer-7890-uiop'
}
}]
}
请注意,此查询确实返回该字段,但我希望它快速加载关联的用户 [Approver] 模型approvedBy
期望回报:
{
id: 'asdf-1234-5678',
username: 'test',
points: 10,
Profiles: [{
name: 'testname',
UserProfiles: {
approved: true,
UserId: 'asdf-1234-5678',
ProfileId: '1',
approvedBy: 'qwer-7890-uiop'
Approver: { <-----
id: 'qwer-7890-uiop', <-----
username: 'approver_username', <-----
points: 50 <-----
} <-----
}
}]
}
谢谢!
答:
要使用精力充沛的堆叠相关客户 [审批者] 模型实现理想的回报,您可以更改问题并合并设置。您希望为客户端模型添加一个已结算的合并,以解决这种情况的“审批者”。
您可以通过以下方式刷新查询:
const user = await User.findOne({
where: { username },
include: [
{
model: Profile,
include: [
{
model: UserProfiles,
include: [
{
model: User,
as: 'Approver', // Alias for the User model representing the approver
attributes: ['id', 'username', 'points'], // Include only specific attributes you need
},
],
},
],
},
],
});
通过添加 Client 模型的已结算合并和 nom de plume 'Approver',您应该获得理想的回报,并记住相关的 Client [Approver] 模型数据作为结果。
要在 Sequelize 问题中热情地堆叠相关的客户端 [Approver] 模型,您需要使用合并选项。此选项允许您确定应与问题中的主模型一起引入的连接模型。对于这种情况,我们需要通过“User_Profiles”连接表合并“Profile”模型及其相关的“UserProfiles”。
为了实现理想的回报,我们真的希望为不同的相关模型解决不同程度的合并问题。首先,我们从 Profile 模型开始,然后进一步合并 UserProfiles 模型。在这个级别上,我们利用另一个固定的合并来堆叠相关的客户端模型,以解决审批者的问题。
在最深层次的合并中,我们使用假名“审批者”来确定客户端模型,这有助于我们将其与第一个客户端模型分开。我们同样可以利用属性选择从“审批者”模型中选择显式字段,我们需要记住这些字段以获得最终结果。
通过适当地解决合并设计,Sequelize 将生成一个具有基本连接的 SQL 问题,以有效地堆叠连接的信息。最终产品将在每个“配置文件”的“UserProfiles”特征下合并相关的“客户 [审批者]”模型数据。沿着这些思路,我们可以了解支持客户的微妙之处以及反应中的不同信息。
评论