postgresql - Sequelize.js - How to create non-trivial associations without raw SQL? -
here situation:
i'm using postgres 9.4, sequelize orm , have following models:
service
- servicecode - primary key, string of 6 characters
- servicetitle - string
servicegroup
- servicecodeprefixes - array of strings prefixes service.servicecode
- servicegrouptitle - string
task
- servicecode - reference service
i need build task object populated service , servicegroup objects. example:
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', }, } the problem servicecodeprefix contains not simple ids, can used create association using hasone/belongsto/etc., prefix id.
so questions is: how can done without raw sql?
turns out right sequelize has experimental feature: 'on' option 'include'. option allows users customize joining conditions. problem can solved way:
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 allow 'include' option work task.hasmany(servicegroup, { foreignkey: 'servicecodeprefix', constraints: false }); // , task.findall({ include: [ { model: service }, { model: servicegroup, on: [' "task"."servicecode" any("servicegroup"."servicecodeprefix") '], }, ], }); not sure performance though.
Comments
Post a Comment