2017-04-25 99 views
0

我有两个模型,policyTablepolicy_rule定义如下。在policy_rule中有一列叫做policy_id,它是一个外键,在policyTable中对id列的引用。 policy_rule可以有多个policyTable,即有1:N的关系。续编简单内连接

var policyTable = dbController.db.define('policyTable', { 
    id: { 
     type: Sequelize.BIGINT, 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    't': { 
     type: Sequelize.BIGINT, 
     unique: true 
    }, 
    'name': { 
     type: Sequelize.STRING, 
    }, 
    src: { 
     type: Sequelize.STRING 
    } 
}, { 
    timestamps: false, 
    freezeTableName: true, 
    tableName: 'zo_policy', 
}); 

var policy_rule = dbController.db.define('policy_rule', { 
    policy_id: { 
     type: Sequelize.BIGINT, 
     references: { 
      model: policyTable, 
      key: 'id' 
     }, 
     onUpdate: 'cascade', 
     onDelete: 'cascade' 
    }, 
    agent_id: { 
     type: Sequelize.BIGINT, 
    }, 
    enabled: { 
     type: Sequelize.BOOLEAN, 
    } 
}, { 
    timestamps: false, 
    freezeTableName: true, 
    tableName: 'zo_policy_rule', 
}); 

现在我想加入这两个模型,并获得它们的所有列。我怎样才能做到这一点?我想下面的代码,但它说

Error: policy_rule is not associated to policyTable!

function getAllPolicies() { 
    return policyTable.findAndCountAll({ 
     include: [{ 
      model: policy_rule 
      }] 
    }).then(function (users) { 
     console.log(users); 
     data.count = users.count; 
     data.users = users.rows; 
     console.log(data); 
     return data; 
    }); 
}; 

回答

1

即使你的关联是在数据库级别定义,并指定此在列定义,使用sequelize的include功能,您还需要明确定义模型之间的关联也是如此。

这里是在DOCO的相关章节:http://docs.sequelizejs.com/en/latest/docs/associations/#belongstohttp://docs.sequelizejs.com/en/latest/docs/associations/#1m

在你的情况,这将意味着调整你的代码沿以下线的东西 - 注意,每个模型定义新classMethods部分:

var policyTable = dbController.db.define('policyTable', { 
    id: { 
     type: Sequelize.BIGINT, 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    't': { 
     type: Sequelize.BIGINT, 
     unique: true 
    }, 
    'name': { 
     type: Sequelize.STRING, 
    }, 
    src: { 
     type: Sequelize.STRING 
    } 
}, { 
    timestamps: false, 
    freezeTableName: true, 
    tableName: 'zo_policy', 
    classMethods: { 
     associate(models) { 
     this.hasMany(models.policy_rule, {foreignKey: 'policy_id'}) 
     } 
    } 
}); 

var policy_rule = dbController.db.define('policy_rule', { 
    policy_id: { 
     type: Sequelize.BIGINT, 
     references: { 
      model: policyTable, 
      key: 'id' 
     }, 
     onUpdate: 'cascade', 
     onDelete: 'cascade' 
    }, 
    agent_id: { 
     type: Sequelize.BIGINT, 
    }, 
    enabled: { 
     type: Sequelize.BOOLEAN, 
    } 
}, { 
    timestamps: false, 
    freezeTableName: true, 
    tableName: 'zo_policy_rule', 
    classMethods: { 
     associate(models) { 
     this.belongsTo(models.policyTable, {foreignKey: 'policy_id'}) 
     } 
    } 
});