【问题标题】:Rich self-association with foreign key constraints in Sequelize with PostgreSQLSequelize with PostgreSQL 中与外键约束的丰富自关联
【发布时间】:2013-11-26 19:14:02
【问题描述】:

我正在使用带有 PostgreSQL 的 SequelizeJS..

我有一张桌子units。我想要一张表unit_relations,列有unit1_idunit2_idtypeunit1_idunit2_id 都应该对 units.id 有外键约束,这样每当删除一个单元时,引用该单元的 unit_relations 的任何行(如 unit1unit2)也将被删除.

在 Sequelize 中,我希望 unit2 映射到 Relationunit1 映射到 ReverseRelation;例如行

单位 unit_relations ------------+---------------- ----------+----------+ -------- 关系ID | reverce_rel_id unit1_id | unit2_id |类型 ------------+---------------- ----------+----------+ -------- | 11 | 43 |父母

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

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

【问题讨论】:

  • 我的问题的外键部分也可以在stackoverflow.com/questions/19686144/… 找到,尽管这不涉及列命名
  • RelationReverseRelationunits 表中吗?
  • Юрий, что вы подразумеваете под фразой to respect my column names - уважать название моих колонок ?
  • @khaljava 是的,它们都引用了单元表中的内容。当我说“尊重我的列名”时,我的意思是我希望将 unit_relations 中的列命名为 unit1_idunit2_id;当 Sequelize 生成列时,它会调用它们 relation_idreverse_relation_id

标签: javascript node.js postgresql sequelize.js


【解决方案1】:

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

//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);
});

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 2012-11-24
    • 1970-01-01
    • 2018-08-21
    • 2019-04-26
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多