2013-11-26 145 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); 
});