续集 (node.js) - 急切地从连接表中的其他外键加载模型

Sequelize (node.js) - Eager Loading a model from additional foreign key in join table

提问人:Matt Westwick 提问时间:8/5/2023 更新时间:8/5/2023 访问量:67

问:

我遇到了一个问题 - 我想急于加载一个额外的模型,该模型包含在 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                       <-----
      }                                  <-----
    }
  }]
}

谢谢!

节点 .js 模型 续集 .js 外键 急切加载

评论


答:

0赞 Milad Hossainie - KAKA SHEX 8/5/2023 #1

要使用精力充沛的堆叠相关客户 [审批者] 模型实现理想的回报,您可以更改问题并合并设置。您希望为客户端模型添加一个已结算的合并,以解决这种情况的“审批者”。

您可以通过以下方式刷新查询:

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”特征下合并相关的“客户 [审批者]”模型数据。沿着这些思路,我们可以了解支持客户的微妙之处以及反应中的不同信息。