【问题标题】:Sequelize.js: One to Many relationship eager load with custom fieldSequelize.js:使用自定义字段的一对多关系急切加载
【发布时间】:2013-10-27 01:50:13
【问题描述】:

我正在用 node、express、sequelize 编写一个应用程序,但我遇到了一个小问题。我正在尝试在关系的“一部分”上加载模型。

我得到了这个 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'});

谢谢大家

【问题讨论】:

  • 当您描述您的Albaran 模型和您的Cliente 模型之间的关系时,您是说Albaran 通过存储cliente.ClienteID 的字段cliente.ClienteID 链接到Cliente .换句话说,sequelize 期望您在Cliente 上拥有一个包含外部AlbaranNo 的字段,因为它建立关联的方式。您可以尝试将它们反向关联(即db.Cliente.hasOne(db.Albaran, {as: "albaran", foreignKey: "ClienteID"}),这可能适用。至于像您已经描述的那样自定义这种关系,我不知道这是否可行。
  • 对不起,我想到了一对一的关系,所以我写错了问题标题。它是一对多,一个客户 对许多albaran。所以,我不能把 AlbaranNo 放在 Cliente 上,也不能写出你建议的关联。 P.D:真的很抱歉,我是新来的。如何更正标题?

标签: node.js express sequelize.js


【解决方案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"});

【讨论】:

  • 我做了这个,所以我可以正确得到db.Cliente.find({ where: { ClienteID: clienteID },include: [{ model: db.Albaran, as: "albaranes" }]}) .success(function (cliente){ res.render('clienteDetalle', {cliente: cliente}); }); },但我想要逆运算:db.Albaran.findAll({ include: [{ model: db.Cliente, as: "cliente" }]}) .success(function (albaranes){ res.render("albaranes", {albaranes: albaranes}); }); 我认为你给我的链接中缺少可以帮助我的文档,就在之后这段文字:......就让它保持原样,让它成为一个单向关联......
猜你喜欢
  • 2015-05-13
  • 2021-12-01
  • 2020-12-26
  • 2017-09-15
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多