【问题标题】:Sequelize.js - How to create non-trivial associations without raw SQL?Sequelize.js - 如何在没有原始 SQL 的情况下创建重要的关联?
【发布时间】:2016-02-08 20:12:21
【问题描述】:

这是我的情况:

我正在使用 postgres 9.4,Sequelize ORM 并有以下模型:

  • 服务

    • serviceCode - 主键,6 个字符的字符串
    • serviceTitle - 字符串
  • 服务组

    • serviceCodePrefixes - 作为 Service.serviceCode 前缀的字符串数组
    • serviceGroupTitle - 字符串
  • 任务

    • serviceCode - 对服务的引用

我需要构建填充了 Service 和 ServiceGroup 对象的 Task 对象。 示例:

In database:
Service {
  serviceCode: '123232',
  serviceTitle: 'svc title #1',
}

ServiceGroup {
  serviceCodePrefix: ['12', '13', '92', ...],
  serviceGroupTitle: 'svc grp title #1',
}

Task {
  serviceCode: '123232',
}

Result:
Task {
  service: {
    serviceTitle: 'svc title #1',
  },
  serviceGroup: {
    serviceGroupTitle: 'svc grp title #1',
  },
}

问题是serviceCodePrefix包含的不是简单的ID,可以使用hasOne/belongsTo/等来创建关联,而是ID的前缀。

所以问题是:如何在没有原始 sql 的情况下做到这一点?

【问题讨论】:

    标签: postgresql sequelize.js


    【解决方案1】:

    事实证明,现在 Sequelize 具有实验性功能:“包含”的“打开”选项。此选项允许用户自定义加入条件。所以我的问题可以这样解决:

    const Service = sequelize.define('service', {
      serviceTitle: Sequelize.STRING,
      serviceCode: Sequelize.STRING,
    });
    
    const ServiceGroup = sequelize.define('service_group', {
      serviceGroupTitle: Sequelize.STRING,
      // Array of prefixes (e.g. ['01%', '023%'])
      serviceCodePrefix: Sequelize.ARRAY(Sequelize.STRING),
    });
    
    const Task = sequelize.define('task', {
      taskTitle: Sequelize.STRING,
      serviceCode: Sequelize.STRING,
    });
    
    Task.belongsTo(Service, { foreignKey: 'serviceCode' });
    
    // Hack needed to allow 'include' option to work
    Task.hasMany(ServiceGroup, { foreignKey: 'serviceCodePrefix', constraints: false });
    
    // And finally
    Task.findAll({
      include: [
        { model: Service },
        {
          model: ServiceGroup,
          on: [' "task"."serviceCode" LIKE ANY("serviceGroup"."serviceCodePrefix") '],
        },
      ],
    });
    

    但不确定性能。

    【讨论】:

    • 嗨,你能指出你在哪里找到关于这个on的文档参考吗?谢谢你!
    • @nvcnvn github.com/sequelize/sequelize/issues/5385 看看 cmets。可悲的是,开发人员似乎还没有为它制作文档。希望有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2020-03-15
    • 2023-04-05
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多