2013-10-25 40 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