Postgresql Sequelize.js-如何在没有原始SQL的情况下创建非平凡的关联?

Postgresql Sequelize.js-如何在没有原始SQL的情况下创建非平凡的关联?,postgresql,sequelize.js,Postgresql,Sequelize.js,以下是我的情况: 我使用的是postgres 9.4,它是ORM的续集,具有以下模型: 服务 serviceCode-主键,6个字符的字符串 serviceTitle-字符串 服务组 serviceCodePrefixes-作为Service.serviceCode前缀的字符串数组 serviceGroupTitle-字符串 任务 serviceCode-对服务的引用 我需要构建用服务和服务组对象填充的任务对象示例: In database: Service { servic

以下是我的情况:

我使用的是postgres 9.4,它是ORM的续集,具有以下模型:

  • 服务

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

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

    • serviceCode-对服务的引用
我需要构建用服务和服务组对象填充的任务对象示例:

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/etc创建关联),而是ID的前缀


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

结果表明,Sequelize现在具有实验性的特性:“on”选项用于“include”。此选项允许用户自定义加入条件。所以我的问题可以这样解决:

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") '],
    },
  ],
});

不过,对性能不太确定。

您好,您能指出在上哪里可以找到有关此
的文档参考吗?谢谢你@nvcnvn查看评论。遗憾的是,开发人员似乎还没有为它制作文档。希望能有帮助