2013-11-26 148 views
2

我使用SequelizeJS PostgreSQL的..丰富与PostgreSQL的

我有一个表units在Sequelize外键约束,自我关联。我想要一个表unit_relations与列unit1_id,unit2_id,typeunit1_idunit2_id都应该有外键约束到units.id,这样任何时候单元被删除时,引用该单元的任何行(如unit1unit2)也会被删除。

在Sequelize中,我想将unit2映射到Relationunit1以映射到ReverseRelation;例如该行

 
      units       unit_relations 
------------+--------------- ----------+----------+------- 
relation_id | reverce_rel_id unit1_id | unit2_id | type 
------------+--------------- ----------+----------+-------- 
      |       11 |  43 | parent 

将由unit1.getRelations()unit2.getReverseRelations()获取。

我很难获得Sequelize尊重我的列名称(它想使用relation_idreverse_relation_id)或创建外键。

+0

我的问题的外键部分也是发现在http://stackoverflow.com/questions/19686144/how-to-enforce-foreign-key-constraints-in-a-self-referencing-association?rq=1,虽然这不涉及列命名 –

+0

'关系'和'R everseRelation'在**单位**表格中? – khex

+0

Юрий,чтовыподразумеваетеподфразой'尊重我的专栏名称' - **уважатьназваниемоихколонок**? – khex

回答

2

我还没有完全理解表之间的所有关系。试着用简单的例子来描述它,而不是抽象的概念。像

//Mary Had A Little Lamb 
Marry.hasOne(Lamp) 

但是从我的理解,你可以这样做:

var Sequelize = require('sequelize'); 
var sequelize = new Sequelize(.... { 
    // your pg db settinds 
}); 

var Unit = sequelize.define('Unit', {}); 

var UnitRel = sequelize.define('UnitRel', { 
    type: Sequelize.STRING 
}); 

// Create in Unit table columns 'relation_id' and 'rev_rel_id' 
UnitRel.hasOne(Unit, {foreignKey: 'relation_id', as: 'Relation'}); 
UnitRel.hasOne(Unit, {foreignKey: 'rev_rel_id', as: 'RevRelation'}); 

// Create in UnitRel table columns 'unit1_id' and 'unit2_id' 
UnitRel.belongsTo(Unit, {foreignKey: 'unit1_id', as: 'Unid_1'}); 
UnitRel.belongsTo(Unit, {foreignKey: 'unit2_id', as: 'Unid_2'}); 



Unit.sync({force: true}).success(function() { 
    UnitRel.sync({force: true}).success(function() { 
     console.log('TABLES CREATED'); 
    }); 
}); 

,然后找到一些UnitRel和伸展相关字段

UnitRel.find({ 
    where: {id: 1}, 
    include:[ 
     {model: Unit, as: 'Uid_1'}, 
     {model: Unit, as: 'Uid_2'} 
    ] 
}).success(function(match) { 
    console.log(JSON.stringify); 
});