2013-10-25 37 views
2

我正在写一个应用程序与节点,快递,续集和我有一个小问题。我试图在关系的“一部分”上加载一个模型。Sequelize.js:一对多关系渴望加载自定义字段

我得到这个SQL:

Executing: SELECT `albaran`.*, `cliente`.`ClienteID` AS `cliente.ClienteID`, 
`cliente`.`NombreES` AS `cliente.NombreES` FROM `albaran` LEFT OUTER JOIN `cliente` AS 
`cliente` ON `albaran`.`AlbaranNo` = `cliente`.`ClienteID` WHERE 
`albaran`.`AlbaranNo`='2013100001'; 

,我需要它是:

Executing: SELECT `albaran`.*, `cliente`.`ClienteID` AS `cliente.ClienteID`, 
`cliente`.`NombreES` AS `cliente.NombreES` FROM `albaran` LEFT OUTER JOIN `cliente` AS 
`cliente` ON `albaran`.`ClienteID` = `cliente`.`ClienteID` WHERE 
`albaran`.`AlbaranNo`='2013100001'; 

这样我就可以在视图访问它(现在我得到一个空字符串):

#{albaran.cliente.NombreES} 

这是代码:

albaran.js

module.exports = function(sequelize, DataTypes) { 
    return sequelize.define("Albaran", { 
     AlbaranNo: { type: DataTypes.BIGINT, primaryKey: true}, 
     ClienteID: { 
      type: DataTypes.STRING, //this must be string, I am not who defined the db 
      references: "Cliente", 
      referencesKey: "ClienteID" 
     }},{ 
      timestamps: false, 
      freezeTableName: true, 
      tableName: 'albaran' 
     }) 
    } 

cliente.js

module.exports = function(sequelize, DataTypes) { 
    return sequelize.define("Cliente", { 
     ClienteID: { 
      type: DataTypes.STRING, primaryKey: true 
     }, 
     NombreES: DataTypes.STRING 
    },{ 
     timestamps: false, 
     freezeTableName: true, 
     tableName: 'cliente' 
    }) 
} 

协会

db.Albaran.hasOne(db.Cliente, {as: "cliente", foreignKey: 'ClienteID'}); 

路由器

exports.albaran = function(req, res) { 
    db.Albaran.findAll({ include: [{ model: db.Cliente, as: "cliente" }]}) 
    .success(function (albaranes){ 
     res.render("albaranes", {albaranes: albaranes}); 
    }); 
}; 

非常感谢你。我希望我清楚地解释自己。

版:

我找到了解决办法修改协会:

db.Albaran.belongsTo(db.Cliente, {as: "cliente", foreignKey: 'ClienteID', primaryKey: 'ClienteID'}); 
db.Cliente.hasMany(db.Albaran, {as: "albaranes", foreignKey: 'ClienteID'}); 

谢谢大家

+0

当你描述你的'Albaran'模型和你的'Cliente'模型之间的关系时,你说'Albaran'通过存储'albaran.AlbaranNo'的字段'cliente.ClienteID'连接到'Cliente'。换句话说,sequelize期待你有一个在Cliente上包含一个外国'AlbaranNo'的字段,因为它使得关联成为可能。你可以试着将它们反向关联(例如'db.Cliente.hasOne(db.Albaran,{as:“albaran”,foreignKey:“ClienteID”})'可能适用。我不知道这是否会起作用 –

+0

不好意思,我想到了一对一的关系,所以我写错了问题标题。它是一对多,一个**客户**到很多** albaran * *所以,我不能把AlbaranNo放在Cliente上,我不能写你建议的协会。PD:真的对不起,我是新来的,我怎么才能纠正这个问题? – junjs

回答

1

这可能是它:

db.Cliente.hasMany(db.Albaran, {as: "albaran", foreignKey: 'ClienteID'}); 

此处了解详情:http://sequelizejs.com/documentation#associations-one-to-many

另一面是:

db.Albaran.hasOne(db.Cliente,{as:“cliente”,foreignKey:'AlbaranNo“});

+0

我做了这个,所以我可以正确地获得'db.Cliente.find({其中:{ClienteID:clienteID},包括:[{model:db.Albaran,as:“albaranes”}]}).success(function(cliente){res.render(' clienteDetalle',{cliente:cliente});});}'但我想要反操作:'db.Albaran.findAll({include:[{model:db.Cliente,as:“cliente”}]})。成功(功能(albaranes){res。渲染(“albaranes”,{albaranes:albaranes}); });''''''''''''我认为那些可以帮助我的文档在你给我的链接中缺少了,就在这段文本后面:......就这样离开它,让它成为一个单向关联...... – junjs